Android图像颜色处理

通过对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图像颜色处理)