【四种方案:实现 图片的 加蒙版(变暗)或 去饱和度(置灰)】

        许久都没有更新CSND 的博客,近几月的确有些忙乱,以至于找不到工作和生活的平衡点,既没有太多时间来自己写博客,记录成长,也没有太多时间担当家事,陪伴老婆照顾孩子。至此自省:为梦想远行,亦不负沿途美景。

        言归正传,近期的一个小需求,觉得可以简单的总结记录一下,走起......

需求:

        PM小姐姐,需要我出临时出一个演示版本的 Launcher,需要部分未完成开发的应用,显示在applist中,但图标置灰,点击无响应,或不可点击。(匪夷所思.....)

直接上解决方案:

【 方案一:静态布局的属性的处理方式 】

        前提条件:图片具有静态布局,而非需要动态加载的图片,且图片显示资源为:background 属性设置;

        在ImageView 布局属性中,把 src 设置为 半透明颜色值,或者是灰暗的图片,建议首选设置半透明色值,节省应用的内存消耗,如:srcandroid:src="#80000000",即可以实现。

【 方案二:动态获取 图片资源 灰色过滤的 Drawable 】

public static Drawable getGrayDrawable(Context context, int resId) {
    Drawable drawable = context.getResources().getDrawable(resId);
    drawable.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
    return drawable;
}

【 方案三:实时 获取 图片资源的 低饱和度 Bitmap  】

 ? 一波常规的 Bitmap 像素级 操作 ~!?

public static Bitmap getLowSaturationBitmap(Context context, int resId) {
        Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resId);
        int width = bitmap.getWidth(); 
        int height = bitmap.getHeight();
        int[] pixels = new int[width * height]; 
        //
        bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
        int alpha = 0xFF << 24;
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                int grey = pixels[width * i + j];
                
                int red = ((grey & 0x00FF0000) >> 16);
                int green = ((grey & 0x0000FF00) >> 8);
                int blue = (grey & 0x000000FF);
                
                grey = (int) (red * 0.3 + green * 0.59 + blue * 0.11);
                grey = alpha | (grey << 16) | (grey << 8) | grey;
                pixels[width * i + j] = grey;
            }
        }
        //
        Bitmap newBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
        newBitmap.setPixels(pixels, 0, width, 0, 0, width, height);
        Bitmap targetBitmap = ThumbnailUtils.extractThumbnail(newBitmap, 460, 460);
        return targetBitmap;
    }

 

【 方案四:实时 获取 图片资源的 0 饱和度 Drawable  】

        Android系统源码中,提供一个用于调整颜色矩阵算法的类 ColorMatrix,这是一个4x5的数字矩阵,颜色的色值则保存在一个4x1的矩阵中,色值的区间为[0,255]。

        其中,有一个通过设置矩阵的浮点数值,来计算、调整或 影响色彩饱和度的方法 :

/**
     * Set the matrix to affect the saturation of colors.
     *
     * @param sat A value of 0 maps the color to gray-scale. 1 is identity.
     */
    public void setSaturation(float sat) {
        reset();
        float[] m = mArray;

        final float invSat = 1 - sat;
        final float R = 0.213f * invSat;
        final float G = 0.715f * invSat;
        final float B = 0.072f * invSat;

        m[0] = R + sat; m[1] = G;       m[2] = B;
        m[5] = R;       m[6] = G + sat; m[7] = B;
        m[10] = R;      m[11] = G;      m[12] = B + sat;
    }

除了直接设置矩阵的设置饱和度外,该类还封装了一些API来快速调整矩阵参数,如:

设置色调:

setRotate(int axis, float degrees)

设置亮度:

setScale(float rScale, float gScale, float bScale,float aScale) {

。。。

setConcat(ColorMatrix matA, ColorMatrix matB)

。。。。。。

等等,这些方法使用起来很简单方便,具体这里就不细说,待以后有机会细细研究后,在做总结分享;

我们只需要这样,就可实现我们的需求了~!

public static Drawable getZeroSaturationDrawable(Context context, int iconResId) {
    Drawable drawable = context.getResources().getDrawable(iconResId);
    ColorMatrix matrix = new ColorMatrix();
    matrix.setSaturation(0);
    drawable.setColorFilter(new ColorMatrixColorFilter(matrix));
    return drawable;
}

【匆忙完结,叩谢~!】

 

你可能感兴趣的:(图像处理)