Pergunta

Existe uma maneira de manipular alpha de uma imagem usando alfa de outra imagem?

Suponha que eu tenho uma imagem e eu quero alterar a sua opaca começando alpha na esquerda e totalmente transparente à direita, atualmente eu chamar uma outra imagem com LinearGradientBrush e conjunto de alfa de imagem original da segunda imagem por looping pixel por pixel, há outra forma Gdiplus, alguns máscara de imagem, ou alfa mistura de duas imagens?

Conclusão:. Parece que não há nenhuma maneira no GDI + para combinar duas imagens, única forma parece ser a forma manual por iteração através pixels

Foi útil?

Solução

Eu acho que você está correto em que você tem que fazer isso pixel por pixel. Eu também procurou uma forma mais "pura" para fazê-lo, mas isso é o que eu acabei com:

    public enum ChannelARGB
    {
        Blue = 0,
        Green = 1,
        Red = 2,
        Alpha = 3
    }

    public static void transferOneARGBChannelFromOneBitmapToAnother(
        Bitmap source,
        Bitmap dest,
        ChannelARGB sourceChannel,
        ChannelARGB destChannel )
    {
        if ( source.Size!=dest.Size )
            throw new ArgumentException();
        Rectangle r = new Rectangle( Point.Empty, source.Size );
        BitmapData bdSrc = source.LockBits( r, ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb );
        BitmapData bdDst = dest.LockBits( r, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb );
        unsafe
        {
            byte* bpSrc = (byte*)bdSrc.Scan0.ToPointer();
            byte* bpDst = (byte*)bdDst.Scan0.ToPointer();
            bpSrc += (int)sourceChannel;
            bpDst += (int)destChannel;
            for ( int i = r.Height * r.Width; i > 0; i-- )
            {
                *bpDst = *bpSrc;
                bpSrc += 4;
                bpDst += 4;
            }
        }
        source.UnlockBits( bdSrc );
        dest.UnlockBits( bdDst );
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top