使用到了ColorMatrix。
Java代码:
package com.figo.imgedit; import java.io.FileNotFoundException; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.ColorMatrix; import android.graphics.ColorMatrixColorFilter; import android.graphics.Paint; import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.widget.ImageView; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; public class ImgeditActivity extends Activity { /** Called when the activity is first created. */ private Bitmap srcBitmap, dstBitmap; private String pathName = "/sdcard/testimg.jpg"; private ImageView dstimage = null; private SeekBar SaturationseekBar = null; private SeekBar BrightnessseekBar = null; private SeekBar ContrastseekBar = null; private int imgHeight, imgWidth; public static final int PICTURE = 0; public static final int MAX_WIDTH = 240; public static final int MAX_HEIGHT = 240; private Uri imageUri; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); dstimage = (ImageView) findViewById(R.id.dstImageView); SaturationseekBar = (SeekBar) findViewById(R.id.Saturationseekbar); BrightnessseekBar = (SeekBar) findViewById(R.id.Brightnessseekbar); ContrastseekBar = (SeekBar) findViewById(R.id.Contrastseekbar); srcBitmap = BitmapFactory.decodeFile(pathName); dstimage.setImageBitmap(srcBitmap); imgHeight = srcBitmap.getHeight(); imgWidth = srcBitmap.getWidth(); dstBitmap = Bitmap.createBitmap(imgWidth, imgHeight, Config.ARGB_8888); SaturationseekBar .setOnSeekBarChangeListener(new OnSeekBarChangeListener() { // 当拖动条的滑块位置发生改变时触发该方法 public void onProgressChanged(SeekBar arg0, int progress, boolean fromUser) { // 创建一个相同尺寸的可变的位图区,用于绘制调色后的图片 Bitmap bmp = Bitmap.createBitmap(imgWidth, imgHeight, Config.ARGB_8888); ColorMatrix cMatrix = new ColorMatrix(); // 设置饱和度 cMatrix.setSaturation((float) (progress / 100.0)); Paint paint = new Paint(); paint.setColorFilter(new ColorMatrixColorFilter(cMatrix)); Canvas canvas = new Canvas(bmp); // 在Canvas上绘制一个已经存在的Bitmap。这样,dstBitmap就和srcBitmap一摸一样了 canvas.drawBitmap(srcBitmap, 0, 0, paint); dstimage.setImageBitmap(bmp); } public void onStartTrackingTouch(SeekBar bar) { } public void onStopTrackingTouch(SeekBar bar) { } }); BrightnessseekBar .setOnSeekBarChangeListener(new OnSeekBarChangeListener() { // 当拖动条的滑块位置发生改变时触发该方法 public void onProgressChanged(SeekBar arg0, int progress, boolean fromUser) { Bitmap bmp = Bitmap.createBitmap(imgWidth, imgHeight, Config.ARGB_8888); int brightness = progress - 127; ColorMatrix cMatrix = new ColorMatrix(); cMatrix.set(new float[] { 1, 0, 0, 0, brightness, 0, 1, 0, 0, brightness,// 改变亮度 0, 0, 1, 0, brightness, 0, 0, 0, 1, 0 }); Paint paint = new Paint(); paint.setColorFilter(new ColorMatrixColorFilter(cMatrix)); Canvas canvas = new Canvas(bmp); // 在Canvas上绘制一个已经存在的Bitmap。这样,dstBitmap就和srcBitmap一摸一样了 canvas.drawBitmap(srcBitmap, 0, 0, paint); dstimage.setImageBitmap(bmp); } public void onStartTrackingTouch(SeekBar bar) { } public void onStopTrackingTouch(SeekBar bar) { } }); ContrastseekBar .setOnSeekBarChangeListener(new OnSeekBarChangeListener() { // 当拖动条的滑块位置发生改变时触发该方法 public void onProgressChanged(SeekBar arg0, int progress, boolean fromUser) { Bitmap bmp = Bitmap.createBitmap(imgWidth, imgHeight, Config.ARGB_8888); // int brightness = progress - 127; float contrast = (float) ((progress + 64) / 128.0); ColorMatrix cMatrix = new ColorMatrix(); cMatrix.set(new float[] { contrast, 0, 0, 0, 0, 0, contrast, 0, 0, 0,// 改变对比度 0, 0, contrast, 0, 0, 0, 0, 0, 1, 0 }); Paint paint = new Paint(); paint.setColorFilter(new ColorMatrixColorFilter(cMatrix)); Canvas canvas = new Canvas(bmp); // 在Canvas上绘制一个已经存在的Bitmap。这样,dstBitmap就和srcBitmap一摸一样了 canvas.drawBitmap(srcBitmap, 0, 0, paint); dstimage.setImageBitmap(bmp); } public void onStartTrackingTouch(SeekBar arg0) { // TODO Auto-generated method stub } public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } }); } /** * 需要加载的图片可能是大图,我们需要对其进行合适的缩小处理 * * @param imageUri */ private Bitmap getSrcImage(Uri imageUri) { try { BitmapFactory.Options ops = new BitmapFactory.Options(); ops.inJustDecodeBounds = true; Bitmap bmp = BitmapFactory.decodeStream(this.getContentResolver() .openInputStream(imageUri), null, ops); int wRatio = (int) Math.ceil(ops.outWidth / (float) MAX_WIDTH); int hRatio = (int) Math.ceil(ops.outHeight / (float) MAX_HEIGHT); if (wRatio > 1 && hRatio > 1) { if (wRatio > hRatio) { ops.inSampleSize = wRatio; } else { ops.inSampleSize = hRatio; } } ops.inJustDecodeBounds = false; bmp = BitmapFactory.decodeStream(this.getContentResolver() .openInputStream(imageUri), null, ops); return bmp; } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); Log.e(this.getClass().getName(), e.getMessage()); } return null; } }布局文件,比较简单:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> <ImageView android:id="@+id/dstImageView" android:scaleType="fitCenter" android:layout_width="fill_parent" android:layout_height="wrap_content" android:maxWidth="240px" android:maxHeight="240px" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_alignParentBottom="true" android:gravity="center_vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/Saturation" /> <!-- 定义一个拖动条,并改变它的滑块外观 --> <SeekBar android:id="@+id/Saturationseekbar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:progress="100" android:max="200" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/Brightness" /> <!-- 定义一个拖动条,并改变它的滑块外观 --> <SeekBar android:id="@+id/Brightnessseekbar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:progress="127" android:max="255" /> </LinearLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:gravity="center_vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/Contrast" /> <!-- 定义一个拖动条,并改变它的滑块外观 --> <SeekBar android:id="@+id/Contrastseekbar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:progress="63" android:max="127" /> </LinearLayout> </LinearLayout> </LinearLayout> 运行结果: