美文网首页
android 控制颜色的明度

android 控制颜色的明度

作者: 弄码哥nomag | 来源:发表于2017-02-28 16:05 被阅读0次

    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;
        }
    
    

    相关文章

      网友评论

          本文标题:android 控制颜色的明度

          本文链接:https://www.haomeiwen.com/subject/bpwxgttx.html