您的位置:首页 > 编程语言 > C#

C# 设置图片透明度源码,支持16/24/32位色深

2017-08-09 11:54 1061 查看
源码:

/// <summary>
/// 设置图像透明度,若原图不为32位ARGB格式,则自动转换为32位ARGB输出
/// </summary>
/// <param name="src">原图</param>
/// <param name="transparency">透明度(0~1之间双精度浮点数)</param>
public static unsafe void SetTransparent(ref Bitmap src, double transparency)
{
if (transparency < 0.0 || transparency > 1.0)
throw new ArgumentOutOfRangeException("透明度必须为0~1之间的双精度浮点数");

BitmapData srcData;
Rectangle rect;
byte* p;

rect = new Rectangle(0, 0, src.Width, src.Height);
src = src.Clone(rect, PixelFormat.Format32bppArgb);
//转换到32位,否则丢失透明度
srcData = src.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb);
//锁定字节数组到内存
p = (byte*)srcData.Scan0.ToPointer();
//获取字节数组在内存中地址
if (src.PixelFormat == PixelFormat.Format32bppArgb)
{
//如果是32位图片,有Alpha通道,以原Alpha通道的值为基准
p += 3;
//默认修改Alpha通道的值
for (int i = 0; i < srcData.Stride * srcData.Height; i += 4)
{
*p = (byte)(*p * transparency);
//原Alpha通道值*透明度
p += 4;
}
}
else
{
//不是32位图片,无Alpha通道,以Alpha通道最大值255为基准
p += 3;
//默认修改Alpha通道的值
for (int i = 0; i < srcData.Stride * srcData.Height; i += 4)
{
*p = (byte)(255 * transparency);
//255*透明度
p += 4;
}
}
src.UnlockBits(srcData);
//解锁
}


找了张24位png测试



测试代码:

static void Main()
{
Bitmap src;

src = new Bitmap("snipaste_20170808_190701.png");
SetTransparent(ref src, 0.5);
src.Save("1.png", ImageFormat.Png);
}


输出:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: