Как скопировать растровые пиксели в другие растровые изображения, сохраняя альфа-прозрачность в C #?
Могут ли некоторые переписать следующую функцию, чтобы использоватьоптимизированный механизм? Я почти уверен, что это не способ продолжить, копируя пиксель за пикселем.
Я читал оAlphaBlend, или жеBitBlt, но я не привык к нативному коду.
public static Bitmap GetAlphaBitmap(Bitmap srcBitmap)
{
Bitmap result = new Bitmap(srcBitmap.Width, srcBitmap.Height, PixelFormat.Format32bppArgb);
Rectangle bmpBounds = new Rectangle(0, 0, srcBitmap.Width, srcBitmap.Height);
BitmapData srcData = srcBitmap.LockBits(bmpBounds, ImageLockMode.ReadOnly, srcBitmap.PixelFormat);
try
{
for (int y = 0; y <= srcData.Height - 1; y++)
{
for (int x = 0; x <= srcData.Width - 1; x++)
{
Color pixelColor = Color.FromArgb(
Marshal.ReadInt32(srcData.Scan0, (srcData.Stride * y) + (4 * x)));
result.SetPixel(x, y, pixelColor);
}
}
}
finally
{
srcBitmap.UnlockBits(srcData);
}
return result;
}
ВАЖНАЯ ЗАМЕТКА: Исходное изображение имеет неправильный формат пикселей (Format32bppRgb), поэтому мне нужно настроить альфа-канал. Это единственный механизм, который работает для меня.
Объясняется причина, по которой изображение src имеет неправильный формат пикселейВот.
Я попробовал следующие варианты без удачи:
Создайте новое изображение и нарисуйте изображение src, используя Graphics.DrawImage из src. Не сохранил альфа.Создание нового изображения с использованием формы Scan0 src. Работает нормально, но имеет проблему, когда GC удаляет образ src (объяснено в этом другомПочта);Это единственное решение, которое действительно работает, но я знаю, что это не оптимально. Мне нужно знать, как это сделать, используя WinAPI или другой оптимальный механизм.
Большое спасибо!