红绿蓝青黄紫白黑,八种色彩之间是可以互相转换的,色彩之间的变化也有着关联。

我尝试用一个百分比trackBar进行调整,蒋指定颜色转换为其他颜色,效果还是比较理想的。

测试原图:

色彩转换


红色转黄色,把参数滑动到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)色彩转换(rgb.ZH * add / 255);  
                        
                          
                            //方案二 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
        }

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-11-15
  • 2021-11-16
  • 2022-12-23
  • 2022-12-23
  • 2021-10-01
  • 2021-04-28
猜你喜欢
  • 2021-09-06
  • 2022-12-23
  • 2021-07-10
  • 2022-01-08
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案