美文网首页
Android图像颜色处理

Android图像颜色处理

作者: 倔强的炉包 | 来源:发表于2017-07-05 15:52 被阅读251次

    通过对rgb像素点的矩阵处理,实现图像:

    /**
         * 处理颜色矩阵
         *
         * @param bm
         * @param hue        色调
         * @param saturation 饱和度
         * @param bright     亮度
         * @return
         */
        public Bitmap handlerBitmapEffect(Bitmap bm, float hue, float saturation, float bright) {
            Bitmap bitmap = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            ColorMatrix mHueMatrix = new ColorMatrix();
            mHueMatrix.setRotate(0, hue);
            mHueMatrix.setRotate(1, hue);
            mHueMatrix.setRotate(2, hue);
    
            ColorMatrix mSaturationMatrix = new ColorMatrix();
            mSaturationMatrix.setSaturation(saturation);
    
            ColorMatrix mBrightMatrix = new ColorMatrix();
            mBrightMatrix.setScale(bright, bright, bright, 1);
    
            ColorMatrix imgMatrix = new ColorMatrix();
            imgMatrix.postConcat(mHueMatrix);
            imgMatrix.postConcat(mSaturationMatrix);
            imgMatrix.postConcat(mBrightMatrix);
    
            mPaint.setColorFilter(new ColorMatrixColorFilter(imgMatrix));
            canvas.drawBitmap(bm, 0, 0, mPaint);
            return bitmap;
        }
    

    1.老照片效果的处理公式:

    r1 = (int)(0.393*r+0.769*g+0.189*b);
    g1 = (int)(0.349*r+0.686*g+0.168*b);
    b1 = (int)(0.272*r+0.534*g+0.131*b);
    
    /** 老照片 */
    public static Bitmap handleImagePixelsOldPhoto(Bitmap bm) {
        Bitmap bmp = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(),
                Bitmap.Config.ARGB_8888);
        int width = bm.getWidth();
        int height = bm.getHeight();
        int color = 0;
        int r, g, b, a, r1, g1, b1;
    
        int[] oldPx = new int[width * height];
        int[] newPx = new int[width * height];
    
        bm.getPixels(oldPx, 0, bm.getWidth(), 0, 0, width, height);
        for (int i = 0; i < width * height; i++) {
            color = oldPx[i];
            a = Color.alpha(color);
            r = Color.red(color);
            g = Color.green(color);
            b = Color.blue(color);
    
            r1 = (int) (0.393 * r + 0.769 * g + 0.189 * b);
            g1 = (int) (0.349 * r + 0.686 * g + 0.168 * b);
            b1 = (int) (0.272 * r + 0.534 * g + 0.131 * b);
    
            if (r1 > 255) {
                r1 = 255;
            }
            if (g1 > 255) {
                g1 = 255;
            }
            if (b1 > 255) {
                b1 = 255;
            }
    
            newPx[i] = Color.argb(a, r1, g1, b1);
        }
        bmp.setPixels(newPx, 0, width, 0, 0, width, height);
        return bmp;
    }
    

    2.浮雕效果处理公式:

    r = (r - r1 + 127);
    g = (g - g1 + 127);
    b = (b - b1 + 127);
    
    /** 浮雕效果 */
    public static Bitmap handleImagePixelsRelief(Bitmap bm) {
        Bitmap bmp = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(),
                Bitmap.Config.ARGB_8888);
        int width = bm.getWidth();
        int height = bm.getHeight();
        int color = 0, colorBefore = 0;
        int a, r, g, b;
        int r1, g1, b1;
    
        int[] oldPx = new int[width * height];
        int[] newPx = new int[width * height];
    
        bm.getPixels(oldPx, 0, bm.getWidth(), 0, 0, width, height);
        for (int i = 1; i < width * height; i++) {
            colorBefore = oldPx[i - 1];
            a = Color.alpha(colorBefore);
            r = Color.red(colorBefore);
            g = Color.green(colorBefore);
            b = Color.blue(colorBefore);
    
            color = oldPx[i];
            r1 = Color.red(color);
            g1 = Color.green(color);
            b1 = Color.blue(color);
    
            r = (r - r1 + 127);
            g = (g - g1 + 127);
            b = (b - b1 + 127);
            if (r > 255) {
                r = 255;
            }
            if (g > 255) {
                g = 255;
            }
            if (b > 255) {
                b = 255;
            }
            newPx[i] = Color.argb(a, r, g, b);
        }
        bmp.setPixels(newPx, 0, width, 0, 0, width, height);
        return bmp;
    }
    

    3.底片效果处理公式:

    r = 255 - r;
    g = 255 - g;
    b = 255 - b;
    
    /** 底片效果 */
    public static Bitmap handleImageNegative(Bitmap bm) {
        int width = bm.getWidth();
        int height = bm.getHeight();
        int color;
        int r, g, b, a;
    
        Bitmap bmp = Bitmap.createBitmap(width, height
                , Bitmap.Config.ARGB_8888);
    
        int[] oldPx = new int[width * height];
        int[] newPx = new int[width * height];
        bm.getPixels(oldPx, 0, width, 0, 0, width, height);
    
        for (int i = 0; i < width * height; i++) {
            color = oldPx[i];
            r = Color.red(color);
            g = Color.green(color);
            b = Color.blue(color);
            a = Color.alpha(color);
    
            r = 255 - r;
            g = 255 - g;
            b = 255 - b;
    
            if (r > 255) {
                r = 255;
            } else if (r < 0) {
                r = 0;
            }
            if (g > 255) {
                g = 255;
            } else if (g < 0) {
                g = 0;
            }
            if (b > 255) {
                b = 255;
            } else if (b < 0) {
                b = 0;
            }
            newPx[i] = Color.argb(a, r, g, b);
        }
        bmp.setPixels(newPx, 0, width, 0, 0, width, height);
        return bmp;
    }
    

    相关文章

      网友评论

          本文标题:Android图像颜色处理

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