【问题标题】:Gdiplus mask image from another image来自另一个图像的 Gdiplus 掩码图像
【发布时间】:2010-11-04 08:50:35
【问题描述】:

有没有办法使用另一个图像的 alpha 来操作图像的 alpha?

假设我有一个图像,我想改变它的 alpha 从左边不透明开始在右边完全透明,目前我用 LinearGradientBrush 绘制另一个图像,并通过逐个像素循环从第二个图像设置原始图像的 alpha,还有另一个在 Gdiplus 中的方式,一些图像掩码,或混合两个图像的 alpha?

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

【问题讨论】:

    标签: gdi+ mask alphablending


    【解决方案1】:

    我认为您是正确的,因为您必须逐个像素地执行此操作。我还寻找了一种更“纯粹”的方式来做到这一点,但这就是我最终得到的:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      • 2016-11-02
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 2014-07-05
      • 2019-12-03
      相关资源
      最近更新 更多