有没有办法使用另一个图像的 alpha 来操作图像的 alpha?
假设我有一个图像,我想改变它的 alpha 从左边不透明开始在右边完全透明,目前我用 LinearGradientBrush 绘制另一个图像,并通过逐个像素循环从第二个图像设置原始图像的 alpha,在 Gdiplus 中有另一种方法吗,一些图像蒙版,或混合两个图像的阿尔法?
结论:在 GDI+ 中似乎没有办法混合两个图像,唯一的方法似乎是通过像素迭代的手动方式。
有没有办法使用另一个图像的 alpha 来操作图像的 alpha?
假设我有一个图像,我想改变它的 alpha 从左边不透明开始在右边完全透明,目前我用 LinearGradientBrush 绘制另一个图像,并通过逐个像素循环从第二个图像设置原始图像的 alpha,在 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 );
}