透明Png黑白图片上色(重新着色、改变成指定颜色)

场景:有时,我们需要给透明Png黑白图片改变成指定颜色(上色)。

前提:我们已经做好了带透明通道的PNG图片。

益处:使用此方法,只需要制作一张透明的黑色PNG图片即可,我们需要不同颜色的同样式图片时,直接使用本程序LOAD一个。

话不多说,直接上代码

   public static Bitmap ChangePngColor(string pngFileName, Color destColor)
        {
            Bitmap curBitmap = (Bitmap)Image.FromFile(pngFileName);
            if (curBitmap != null)
            {
                Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height);
                BitmapData bmpData = curBitmap.LockBits(rect, ImageLockMode.ReadWrite, curBitmap.PixelFormat);
                int c = curBitmap.PixelFormat == PixelFormat.Format32bppArgb ? 4 : 3;
                IntPtr ptr = bmpData.Scan0;
                int numBytes = bmpData.Stride * curBitmap.Height;
                byte[] rgbValues = new byte[numBytes];
                Marshal.Copy(ptr, rgbValues, 0, numBytes);
                for (int counter = 0; counter < rgbValues.Length; counter += c)
                {
                    if (c == 3)
                    {
                        if (rgbValues[counter] != destColor.R &&
                            rgbValues[counter + 1] != destColor.G &&
                            rgbValues[counter + 2] != destColor.B)
                        {
                            rgbValues[counter] = destColor.R;
                            rgbValues[counter + 1] = destColor.G;
                            rgbValues[counter + 2] = destColor.B;
                        }
                    }
                    else if (c == 4)
                    {
                        if (rgbValues[counter + 3] > 128 && rgbValues[counter] < 20)
                        {
                            rgbValues[counter] = destColor.B;
                            rgbValues[counter + 1] = destColor.G;
                            rgbValues[counter + 2] = destColor.R;
                            rgbValues[counter + 3] = destColor.A;
                        }
                    }
                }
                Marshal.Copy(rgbValues, 0, ptr, numBytes);
                curBitmap.UnlockBits(bmpData);
            }
            return curBitmap;
        }

调用方法:

        private void menuItemPngToColorImage_Click(object sender, EventArgs e)
        {
            Color destColor = Color.FromArgb(255, Color.Red);
            string pngFileName = @"XXX.png";
            Bitmap curBitmap = ChangePngColor(pngFileName, destColor);
            using (Graphics gg = this.CreateGraphics())
            {
                gg.Clear(Color.White);
                gg.SmoothingMode = SmoothingMode.HighQuality;
                gg.DrawImage(curBitmap, 0, 0, curBitmap.Width, curBitmap.Height);             
            }
        }

原图:

 改变颜色后的图片:

 注意:为了加快速度,需要允许不安全代码。

另:

也可以采用类似如下代码:

public static Bitmap ReplaceColor(string photoFileName, Color oldColor, Color newColor)
{
	Bitmap result=new Bitmap(1,1);
	using (Bitmap bmp = new Bitmap(@photoFileName))
	{
		result=new Bitmap(bmp.Width,bmp.Height);
		Graphics g = Graphics.FromImage(result);
		g.CompositingQuality = CompositingQuality.HighQuality;
		g.InterpolationMode = InterpolationMode.HighQualityBicubic;
		g.SmoothingMode = SmoothingMode.HighQuality;
		ColorMap[] colorMap = new ColorMap[1];
		colorMap[0] = new ColorMap();
		colorMap[0].OldColor = oldColor;
		colorMap[0].NewColor = newColor;
		ImageAttributes attr = new ImageAttributes();
		attr.SetRemapTable(colorMap);
		Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);        
		g.DrawImage(bmp, rect, 0, 0, rect.Width, rect.Height, g.PageUnit, attr);
	}
	return result;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值