花了二天的时间,自己写了一个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)