色彩转换

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

我尝试用一个百分比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
        }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值