android 图片调色


先说一下调色的一些基本概念

图片的色彩主要由色相、饱和度、明度决定。色相主要是说色彩的变化,比如红色变化后变成绿色。饱和度是说颜色的鲜艳、丰富程度。而明度则是强调明暗,最暗则为全黑,最亮为全白。明度的概念比较好理解。下面用photoshop里的图片来说明色相和饱和度。


A.饱和度B.色相C.亮度D.全部色相


色相表现为色轮的旋转角度。

photo文本框中显示的值反映像素原来的颜色在色轮中旋转的度数。正值表示顺时针旋转,负值表示逆时针旋转。数值的范围可以从 -180 到 +180。

饱和度表现为距离色轮中心的距离

颜色相对于所选像素的起始颜色值,从色轮中心向外移动,或从外向色轮中心移动。数值的范围可以从 -100 到 +100。

明亮度则表现为RGB各分量的大小,0表示最暗,255表示最亮

代码:

           Bitmap show;                                         //这就是原始的图片

           int flag;                                                 // 比特位0 表示是否改变色相,比位1表示是否改变饱和度,比特位2表示是否改变明亮度

            int wi = show.getWidth();                      //得到宽度
            int he = show.getHeight();                    //得到高度
            Bitmap bmp = Bitmap.createBitmap(wi, he, Bitmap.Config.ARGB_8888);     

                                                                       //创建一个相同尺寸的可变的位图区,用于绘制调色后的图片
            Canvas canvas = new Canvas(bmp); //得到画笔对象
            Paint paint = new Paint();                  //新建paint
            paint.setAntiAlias(true);                     //设置抗锯齿,也即是边缘做平滑处理

            ColorMatrix cm1=new ColotMatrix(); //用于颜色变换的矩阵,android  位图颜色变化处理主要是靠该对象完成
            ColorMatrix cm2=new ColotMatrix();           

            ColorMatrix cm3=new ColotMatrix();            

            cm1.reset();                                     //设为默认值

            if ((flag & 1) != 0)                           //需要改变色相
            {

               //hueColor就是色轮旋转的角度,正值表示顺时针旋转,负值表示逆时针旋转
                cm1.setRotate(0, hueColor);    //控制让红色区在色轮上旋转hueColor葛角度
                cm1.setRotate(1, hueColor);    //控制让绿红色区在色轮上旋转hueColor葛角度
                cm1.setRotate(2, hueColor);    //控制让蓝色区在色轮上旋转hueColor葛角度

              //这里相当于改变的是全图的色相
            }
            if ((flag & 2) != 0)                         //需要改变饱和度
            {

               //saturation 饱和度值,最小可设为0,此时对应的是灰度图(也就是俗话的“黑白图”),

               //为1表示饱和度不变,设置大于1,就显示过饱和

                cm2.reset();
                cm2.setSaturation(saturation);
                cm1.postConcat(cm2);          //效果叠加
            }
            if ((flag & 4) != 0)
            {

               //f 表示亮度比例,取值小于1,表示亮度减弱,否则亮度增强

                cm3.reset();
                cm3.setScale(f, f, f, 1);  //红、绿、蓝三分量按相同的比例,最后一个参数1表示透明度不做变化,此函数详细说明参考 android doc

                cm1.postConcat(cm3);       //效果叠加
            }
            paint.setColorFilter(new ColorMatrixColorFilter(cm1));//设置颜色变换效果
            canvas.drawBitmap(show, 0, 0, paint);      //将颜色变化后的图片输出到新创建的位图区
            return bmp;                        //返回新的位图,也即调色处理后的图片

                           

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个基于Python和OpenCV库的获取图片调色板的代码示例: ```python import cv2 # 载入图像 img = cv2.imread('image.jpg') # 转换成HSV颜色空间 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 计算直方图 hist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256]) # 归一化直方图 cv2.normalize(hist, hist, 0, 255, cv2.NORM_MINMAX) # 创建一个空白图像 h, w = img.shape[:2] palette = np.zeros((h, w, 3), dtype=np.uint8) # 遍历每一个像素 for i in range(h): for j in range(w): # 取得当前像素的HSV值 h, s, v = hsv[i, j] # 计算像素在直方图中的位置 bin_h = int(h * 180 / 256) bin_s = int(s * 256 / 256) # 取得直方图中对应位置的值 value = int(hist[bin_h, bin_s]) # 将值作为像素的RGB值 palette[i, j] = (value, value, value) # 显示调色板图像 cv2.imshow('palette', palette) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在代码中,我们首先使用`cv2.imread()`函数加载需要获取调色板的图像。然后,我们将图像转换成HSV颜色空间,方便计算直方图。接下来,我们使用`cv2.calcHist()`函数计算直方图,并使用`cv2.normalize()`函数归一化直方图的值。然后,我们创建一个空白图像`palette`,遍历每一个像素,计算像素在直方图中的位置,并取得直方图中对应位置的值,将值作为像素的RGB值,最后将RGB值赋给`palette`图像中对应位置的像素。最后,使用`cv2.imshow()`函数将调色板图像显示出来。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值