Como copiar pixels de bitmap para outro bitmap, preservando a transparência alfa em c #?

Pode reescrever a seguinte função para usar qualquer otimizado mecanismo? Tenho certeza de que esse não é o caminho a seguir, copiando pixel por pixel.

Li sobre AlphaBlend ou BitBlt, mas não estou acostumado ao código nativo.

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;
}

NOTA IMPORTANT: A imagem de origem tem um formato de pixel errado (Format32bppRgb), por isso preciso ajustar o canal alfa. Este é o único mecanismo que funciona para mim.

A razão pela qual a imagem src tem um formato de pixel errado é explicadaaqu.

Tentei as seguintes opções sem sorte:

Criando uma nova imagem e desenhe a imagem src usando o Graphics.DrawImage de src. Não preservou o alfa. Criando uma nova imagem usando o formulário Scan0 src. Funciona bem, mas tem um problema quando o GC descarta a imagem src (explicada neste outposta);

Esta solução é a única que realmente funciona, mas sei que não é a ideal. Preciso saber como fazer isso usando o WinAPI ou outro mecanismo ideal.

Muito obrigado

questionAnswers(6)

yourAnswerToTheQuestion