ColorMatrix的使用

花了二天的时间,自己写了一个Colormatrix的工具类,实现了一个美图秀秀效果。下面的几个算法我也不是很清楚,很敬佩那些研究算法的大牛们!

public class ImageHelper {
    public static Bitmap HandleImageEffect(Bitmap bitmap,float hue,float saturate,float lum){
        Bitmap newBitmap =  Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(), Bitmap.Config.ARGB_8888);
        //创建画布
        Canvas canvas  = new Canvas(newBitmap);
        //创建画笔
        Paint  paint  = new Paint(Paint.ANTI_ALIAS_FLAG);
        //拿到ColorMatrix的对象 
        ColorMatrix hueMatrix  =  new ColorMatrix();
        //设置色调,0代表红色,1代表绿色,2代表蓝色
        hueMatrix.setRotate(0,hue);
        hueMatrix.setRotate(1,hue);
        hueMatrix.setRotate(2,hue);

        ColorMatrix saturateMatrix  =  new ColorMatrix();
        //设置饱和度
        saturateMatrix.setSaturation(saturate);

        ColorMatrix lumMatrix  =  new ColorMatrix();
        //设置亮度
        lumMatrix.setScale(lum,lum,lum,1);

        ColorMatrix ImageMatrix  =  new ColorMatrix();
        //将3个一起使用
        ImageMatrix.postConcat(hueMatrix);
        ImageMatrix.postConcat(saturateMatrix);
        ImageMatrix.postConcat(lumMatrix);

        paint.setColorFilter(new           ColorMatrixColorFilter(ImageMatrix));
        canvas.drawBitmap(bitmap,0,0,paint);


        return  newBitmap;
    }
  //下面3个小Demo通过改变像素点,来实现效果
  //底片效果
    public static Bitmap handleNegative(Bitmap bm){
        int width = bm.getWidth();
        int height = bm.getHeight();
        int color;
        int r,g,b,a;
        //原来照片的像素
        int oldPix[] = new int[width*height];
        //新生成的像素
        int newPix[] = new int[width*height];
        //创建新的位图,注意:传进来的位图参数不能更改
        Bitmap bitmap  = Bitmap.createBitmap( width,height,  Bitmap.Config.ARGB_8888);
        //得到原图的像素点
        bm.getPixels(oldPix,0,width,0,0,width,height);
        for (int i = 0; i < width*height; i++) {
            color=oldPix[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;
           //保证每个像素点在0-255之间
            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;
            }
            newPix[i]  = Color.argb(a,r,g,b);


        }
     bitmap.setPixels(newPix,0,width,0,0,width,height);
        return  bitmap;
    }
   //复古
    public static Bitmap handleImagePixelsOldPhoto(Bitmap bm) {
        int width = bm.getWidth();
        int height = bm.getHeight();
        int color;
        int r,g,b,a,r1,g1,b1,a1;
        int oldPix[] = new int[width*height];
        int newPix[] = new int[width*height];
        Bitmap bitmap  = Bitmap.createBitmap( width,height,  Bitmap.Config.ARGB_8888);
        bm.getPixels(oldPix,0,width,0,0,width,height);
        for (int i = 0; i < width*height; i++) {
            color=oldPix[i];
            r = Color.red(color);
            g= Color.green(color);
            b = Color.blue(color);
            a = Color.alpha(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;
            }else if(r1<0){
                r1 =0;
            }
            if(g1>255){
                g1=255;
            }else if(g1<0){
                g1=0;
            }
            if(b1>255){
                b1=255;
            }else if(b1<0){
                b1 =0;
            }
            newPix[i]  = Color.argb(a,r1,g1,b1);


        }
        bitmap.setPixels(newPix,0,width,0,0,width,height);
        return  bitmap;

    }
    //浮雕
    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);
        //注意:浮雕效果图需要前一位的像素点,所以从i=1开始并不是0
        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;
    }

下面是我的布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

<LinearLayout
  android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
  >
    <ImageView
        android:layout_width="0dp"
        android:id="@+id/imageView1"
        android:layout_height="match_parent"
        android:layout_weight="1"/>
    <ImageView
        android:layout_width="0dp"
        android:id="@+id/imageView2"
        android:layout_height="match_parent"
        android:layout_weight="1"/>



</LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        >

        <ImageView
            android:id="@+id/imageView3"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"/>
        <ImageView
            android:layout_width="0dp"
            android:id="@+id/imageView4"
            android:layout_height="match_parent"
            android:layout_weight="1"/>


    </LinearLayout>
</LinearLayout>

布局写完之后就要通过java代码去调用我们的工具类了。

package com.yu.colormetrix;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;

/**
 * Created by Administrator on 2016/3/31.
 */
public class Cang extends Activity {
    private ImageView imageView1;
    private ImageView imageView2;
    private ImageView imageView3;
    private ImageView imageView4;
    private Bitmap bitmap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.cang);
        //原图
        imageView1= (ImageView) findViewById(R.id.imageView1);
        //底片效果
        imageView2= (ImageView) findViewById(R.id.imageView2);
        //复古
        imageView3= (ImageView) findViewById(R.id.imageView3);
        //浮雕
        imageView4= (ImageView) findViewById(R.id.imageView4);

        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test2);

        imageView1.setImageBitmap(bitmap);
        imageView2.setImageBitmap(ImageHelper.handleNegative(bitmap));
        imageView3.setImageBitmap(ImageHelper.handleImagePixelsOldPhoto(bitmap));
 imageView4.setImageBitmap(ImageHelper.handleImagePixelsRelief(bitmap));

    }

}
最后我们来看一下最终的效果图,这里我们使用的是大家所熟悉的仓老师美图.
![这里写图片描述](http://img.blog.csdn.net/20160331172715386)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值