Cómo copiar píxeles de mapa de bits a otro mapa de bits conservando la transparencia alfa en C #?

lgunos podrían reescribir la siguiente función para usar cualquier optimizado mecanismo? Estoy bastante seguro de que esta no es la forma de proceder, copiando píxel por píxel.

He leído sobre AlphaBlend o BitBlt, pero no estoy acostumbrado al 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: La imagen de origen tiene un formato de píxel incorrecto (Format32bppRgb), por lo que necesito ajustar el canal alfa. Este es el único mecanismo que funciona para mí.

La razón por la cual la imagen src tiene un formato de píxel incorrecto se explicaaqu.

Intenté las siguientes opciones sin suerte:

Creando una nueva imagen y dibujando la imagen src usando Graphics.DrawImage de src. No conservó el alfa.Creando una nueva imagen usando el formulario Scan0 src. Funciona bien, pero tiene un problema cuando el GC desecha la imagen src (explicada en esta otraenvia);

Esta solución es la única que realmente funciona, pero sé que no es óptima. Necesito saber cómo hacerlo utilizando WinAPI u otro mecanismo óptimo.

¡Muchas gracias

Respuestas a la pregunta(6)

Su respuesta a la pregunta