zoukankan      html  css  js  c++  java
  • 安卓图像处理入门教程

    第1章 图像处理概念介绍

    1、RGBA模型分析

    RGB:red,green,blue,alpha
    色相:物体传递的颜色
    饱和度:颜色的灰度,从0(灰)-100%
    

    亮度:颜色的相对明暗程度

    ColorMatrix
    setRotate()
    setSaturation()
    setScale()
    postConcat()

    第2章 颜色矩阵变换与实例

    图片中矩阵的作用通常用于初始化颜色矩阵
    这里写图片描述

    第3章 像素点分析与实例

    1.使用getPixels()方法可获取图片的所有点的颜色值,一般采用以下格式:bitmap.getPixels(int[] ,0,width,0,0,width,height)。
    参数说明:存放像素值的数组->最开始读取像素时的偏移量->行距(多少算作一行,一般去width)->(x,y)第一次读取参数的目标->要读取像素的长度->要读取像素的宽度

    2.获取所有点的颜色值后,想对像素点进行操作,则需要一Color。red(color)方法读取R分量,G、B、Alpha分量类似。此处的color为之前存放在数组里的颜色值

    3.处理RGB值之后,还需检查其是否依旧在(0,255)范围内

    4.使用方法newPx[i] = Color.argb(a, r, g, b);将新的RGB值创造新的颜色值

    5.使用bmp.setPixels(newPx, 0, width, 0, 0, width, height);将颜色值应用到图片上,返回图片

      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;
    

    老照片

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

    浮雕

     r = (r - r1 + 127);
        g = (g - g1 + 127);
        b = (b - b1 + 127);
    

    ImageHelper工具类

    public class ImageHelper {
    public static Bitmap handleImageEffect(Bitmap bm, float hue, float saturation, float lum) {
        Bitmap bmp=Bitmap.createBitmap(bm.getWidth(),bm.getHeight(),Bitmap.Config.ARGB_8888);
        Canvas canvas=new Canvas(bmp);
        Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG);
    
        ColorMatrix hueMatrix=new ColorMatrix();
        hueMatrix.setRotate(0,hue);
        hueMatrix.setRotate(1, hue);
        hueMatrix.setRotate(2, hue);
    
        ColorMatrix saturationMatrix=new ColorMatrix();
        saturationMatrix.setSaturation(saturation);
    
        ColorMatrix lumMatrix=new ColorMatrix();
        lumMatrix.setScale(lum,lum,lum,1);
    
        ColorMatrix imageMatrix=new ColorMatrix();
        imageMatrix.postConcat(hueMatrix);
        imageMatrix.postConcat(saturationMatrix);
        imageMatrix.postConcat(lumMatrix);
    
        paint.setColorFilter(new ColorMatrixColorFilter(imageMatrix));
        canvas.drawBitmap(bm,0,0,paint);
    
        return bmp;
    }
    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;
    }
    
    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;
    }
    
    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;
    }
    }
    
  • 相关阅读:
    LeetCode(287)Find the Duplicate Number
    LeetCode(290) Word Pattern
    LeetCode(205)Isomorphic Strings
    LeetCode(201) Bitwise AND of Numbers Range
    LeetCode(200) Number of Islands
    LeetCode(220) Contains Duplicate III
    LeetCode(219) Contains Duplicate II
    命令行执行Qt程序
    LeetCode(228) Summary Ranges
    redis 的安装和使用记录
  • 原文地址:https://www.cnblogs.com/sdksdk0/p/5585091.html
Copyright © 2011-2022 走看看