代码之家  ›  专栏  ›  技术社区  ›  Anurag Uniyal

另一个图像的gdiplus蒙版图像

  •  1
  • Anurag Uniyal  · 技术社区  · 15 年前

    有没有一种方法可以使用另一个图像的alpha来操纵图像的alpha?

    假设我有一个图像,我想改变它的alpha,从左开始不透明,从右开始完全透明,现在我用lineargradientbrush绘制另一个图像,通过逐像素循环设置第二个图像的alpha,在gdiplus中有没有其他方法,一些图像蒙版,或者混合两个图像的alpha?

    结论:在gdi+中似乎没有混合两个图像的方法,唯一的方法似乎是通过迭代像素手动实现。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Dan Byström    15 年前

    我认为你是正确的,你必须一个像素一个像素地做这个。我也在寻找一种更“纯粹”的方法来做这件事,但这就是我最终得出的结论:

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