美文网首页
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图像颜色处理

    通过对rgb像素点的矩阵处理,实现图像: 1.老照片效果的处理公式: 2.浮雕效果处理公式: 3.底片效果处理公式:

  • Android拖动条(SeekBar)简单源码剖析

    写在开始之前 在Android的色彩处理中,我们通常用三个角度来描述一个图像:色调: 图像的颜色饱和度:颜色的纯度...

  • Android实现制作灰色图片

    色彩矩阵 要想实现Android图像特效处理需要了解色彩矩阵: 色彩处理需要三个方面调整图片颜色:1、色调----...

  • Android开发之图像处理那点事——滤镜

    在Android开发中,一般对图像的处理就是Bitmap(位图),它包含了图像的全部数据,即点阵和颜色值,点阵就是...

  • 图像处理常见方法

    1、颜色转换 以红色图像为例。在图像中提取红色部分颜色。 2. 二值化处理 1) 二值化处理 2) 自动二值化处理...

  • 数字图像处理的分类

      根据对图像处理的不同目的,数字图像处理可以分为3类: 1、改善图像质量:   如进行图像的亮度和颜色变换,增强...

  • Android NDK开发:实战案例-电动车牌号识别(图像的处理

    目录 图像二值化处理 这里主要是将图像处理成只有黑白两种颜色的图像,这样有利于图像的识别,这里为了提升处理的速度因...

  • Android图像处理

    图像色彩处理 Android对图片的处理,通常用到的数据结构就是位图—Bitmap,它包含了一张图片的所有数据。整...

  • OpenCV for Python 学习笔记(一)

    1.图像分类 rgb图像、灰度图像、二值图像 2.修改像素颜色 可以对多个像素处理 image[100:150,1...

  • Android 颜色处理

    需求 在最近的项目开发中遇到了这种UI,顶部有一组彩色圆形按钮。选中以后颜色会加深。这样的按钮一共有十二个。 而设...

网友评论

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

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