Как скопировать растровые пиксели в другие растровые изображения, сохраняя альфа-прозрачность в 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 или другой оптимальный механизм.

Большое спасибо!

Ответы на вопрос(3)

Ваш ответ на вопрос