Gdiplus маска изображение с другого изображения

StackOverflow https://stackoverflow.com/questions/1018868

  •  06-07-2019
  •  | 
  •  

Вопрос

Есть ли способ манипулировать альфой изображения, используя альфа из другого изображения?

Предположим, у меня есть изображение, и я хочу изменить его альфа, начиная непрозрачным слева и полностью прозрачным справа, в настоящее время я рисую другое изображение с помощью LinearGradientBrush и устанавливаю альфа оригинального изображения из второго изображения, повторяя пиксель за пикселем, есть ли другой Кстати, в Gdiplus какая-то маска изображения или альфа-смешение двух изображений?

Вывод: кажется, что в GDI + нет способа смешать два изображения, кажется, что единственный способ - это ручной путь с помощью итерации по пикселям.

Это было полезно?

Решение

Я думаю, что вы правы в том, что вы должны делать это попиксельно. Я также искал более "чистый" способ сделать это, но это то, что я в конечном итоге:

    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 );
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top