红绿蓝青黄紫白黑,八种色彩之间是可以互相转换的,色彩之间的变化也有着关联。
我尝试用一个百分比trackBar进行调整,蒋指定颜色转换为其他颜色,效果还是比较理想的。
测试原图:
![](https://i-blog.csdnimg.cn/blog_migrate/20e5b9796927ccc86964ee108ec8db84.jpeg)
红色转黄色,把参数滑动到100%,右边选择红色转黄色
下面这个是红色的80%转换为蓝色
这里分享一个紫色转换为白色的代码。
private void 紫转白()
{ //紫红、蓝紫色(紫色转白色)unsafe
{
bitmapOp = new Bitmap(objImage.getPeekImage());
int bmpWidth = bitmapOp.Width;
int bmpHeight = bitmapOp.Height; //rd("\r" + Width.ToString() + Height.ToString());
Rectangle rect = new Rectangle(0, 0, bmpWidth, bmpHeight);
System.Drawing.Imaging.BitmapData bmpData = bitmapOp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);//curBitmap.PixelFormat
rgbClassRef rgb = new rgbClassRef();
byte* ptr = (byte*)(bmpData.Scan0); //数据头指针
int iOffset = bmpData.Stride - bmpData.Width * 3; //我喜欢这样的定义,标准
int add = trackBarBlack.Value;
for (int y = 0; y < bmpHeight; y++)
{
for (int x = 0; x < bmpWidth; x++)
{
if (ptr[1] < ptr[0] && ptr[1] < ptr[2]) //最小值是红色,即青色
{
rgb.SetRGB(ref ptr[2], ref ptr[1], ref ptr[0]);// 输入r,g,b
//方案一 紫色100%时,紫色全部去掉,ZH=0,两边剩下纯红和纯蓝色rgb.X=rgb.Z,未达到100%则色相改变.
//rgb.g += (byte)
![](https://i-blog.csdnimg.cn/blog_migrate/df4f0657fddd38bbf101a65239c027b7.jpeg)
//方案二 0-100%保持色相不变
rgb.r += (byte)((255 - rgb.r) * add / 255 * rgb.ZH / 255);
rgb.g += (byte)((255 - rgb.g) * add / 255 * rgb.ZH / 255);
rgb.b += (byte)((255 - rgb.b) * add / 255 * rgb.ZH / 255);
// }
}
ptr += 3; //Format24bppRgb格式每个像素占3字节
}
ptr += iOffset; //每行读取到最后“有用”数据时,跳过未使用空间XX
}
bitmapOp.UnlockBits(bmpData);
}//unsafe
}