android 控制颜色的明度

来源:http://www.jianshu.com/p/ee93fab7c0d9 这个人的博客

android 控制颜色的明度

什么是明度?

今天,设计同学找我,让我修改一个图片的明度。当时我就懵逼了:什么是明度?经过一番查询,我才发现,原来世界上表示颜色的方法不是只有 aRGB !

大多数电视机、显示器、投影仪通过将不同强度的红、绿、蓝色光混合来生成不同的颜色,这就是RGB 三原色的加色法。通过这种方法可以在RGB色彩空间生成大量不同的颜色,然而,这三种颜色分量的取值与所生成的颜色之间的联系并不直观。

艺术家有时偏好使用HSL或HSV而不选择三原色光模式(即RGB模型)或 印刷四分色模式(即CMYK模型),因为它类似于人类感觉颜色的方式,具有较强的感知度。RGB和CMYK分别是加法原色和减法原色模型,以原色组合的方式定义颜色,而HSV以人类更熟悉的方式封装了关于颜色的信息:“这是什么颜色?深浅如何?明暗如何?”。

问题解决

从资料中可以得出,明度就是这个颜色亮不亮。那么我们这里其实有两种方法可以解决这个问题。

方法一:
直接改。

int color = Color.*parseColor*("#666666");

float[] hsv = new float[3];

Color.*colorToHSV*(color, hsv);

然后我们直接对 float[] hsv 的对应分量进行调整就可以了,比如 hsv[2] *= 2.

方法二:
从用颜色矩阵改。
只需要把各个颜色的系数调整一下就可以了。android 给我们提供了 ColorMatrix 方便我们操作矩阵。但是我写的时候,因为用到了 RenderScript,但是 RenderScript 的 api 不支持 ColorMatrix 作为参数。所幸,它支持 Matrix3f(也是 android 内置的)。Matrix3f 和 ColorMatrix 用法类似。代码如下:

private static final Matrix3f BRIGHTNESS_ADJUSTMENT_FACTOR_MATRIX = new Matrix3f(new float[]{
            0.9f, 0.0f, 0.0f,
            0.0f, 0.9f, 0.0f,
            0.0f, 0.0f, 0.9f,
    });


 public static Bitmap adjustBrightness(Context context, Bitmap image) {

        Bitmap inputBitmap = Bitmap.createBitmap(image);
        Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap);

        RenderScript rsColorMatrix = RenderScript.create(context);
        ScriptIntrinsicColorMatrix scriptIntrinsicColorMatrix = ScriptIntrinsicColorMatrix.create(rsColorMatrix, Element.U8_4(rsColorMatrix));
        Allocation colorMatrixIn = Allocation.createFromBitmap(rsColorMatrix, inputBitmap);
        Allocation colorMatrixOut = Allocation.createFromBitmap(rsColorMatrix, outputBitmap);

        scriptIntrinsicColorMatrix.setColorMatrix(BRIGHTNESS_ADJUSTMENT_FACTOR_MATRIX);
        scriptIntrinsicColorMatrix.forEach(colorMatrixIn, colorMatrixOut);
        colorMatrixOut.copyTo(outputBitmap);
        rsColorMatrix.destroy();

        return outputBitmap;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值