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

来源:互联网 发布:js 去除disabled 编辑:程序博客网 时间:2024/06/05 21:17

源码:

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

输出:
输出