//1.返回图像bitmap对象
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
//2.可修改olterbitmap 属性与 bitmap一致
alterBitemp = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),bitmap.getConfig());
//3.画出来-两张图片-位置基于左上角
//画布
canvas = new Canvas(alterBitemp);
colorMatrix = new ColorMatrix();
paint = new Paint();
// canvas.drawBitmap()画笔-合成模式
paint.setColor(Color.BLACK);
//设置画笔过滤器-new()的颜色矩阵
paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
// paint.setAntiAlias(ture);//利用算法消除旋转锯齿
canvas.drawBitmap(bitmap, new Matrix(), paint);
//4.显示imageView
iv.setImageBitmap(alterBitemp);
<pre name="code" class="java">package com.example.imagetoimage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.Toast;
/**
* 图片合成
* 1.先创建画布
* 2.先画A图片 & 在画B图
* 3.合成完毕
* -找不同原理就是利用两张图片重叠 paint.setXfermode()属性设置Darken
*/
public class MainActivity extends Activity {
private ImageView iv;
private Bitmap bitmap,alterBitemp,ic_luncher;
private Canvas canvas;
private SeekBar seekBar1,seekBar2,seekBar3,seekBar4;
private ColorMatrix colorMatrix;//颜色矩阵
private Paint paint;
private String filename;//拍照的文件名
private static final String DATA_PATH="/sdcard/imageShared/"; //拍照图片保存目录
private static final String DATA_PATH_VIDEO="/sdcard/VideoShared/"; //相机录像文件保存目录
private static final int REQUESTCODE =1;//requestCode标记,做判断时用到
private static final int REQUESTCODE_SELECT_IMAGE= 2;//选择相册reouestCode
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initSdcard();
iv =(ImageView) findViewById(R.id.iv);
seekBar1 = (SeekBar) findViewById(R.id.seekBar1);
seekBar2 = (SeekBar) findViewById(R.id.seekBar2);
seekBar3 = (SeekBar) findViewById(R.id.seekBar3);
seekBar4 = (SeekBar) findViewById(R.id.seekBar4);
seekBar1.setOnSeekBarChangeListener(new seekBar1Listen());
seekBar2.setOnSeekBarChangeListener(new seekBar2Listen());
seekBar3.setOnSeekBarChangeListener(new seekBar3Listen());
seekBar4.setOnSeekBarChangeListener(new seekBar4Listen());
//画布-修改图片
// canvasBitmap();
}
/**
* 画布-修改图片
*/
private void canvasBitmap(String path) {
System.out.println("fileName"+path);
//返回图像bitmap对象
bitmap = BitmapFactory.decodeFile(path, null);
// bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
ic_luncher =BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
//可修改olterbitmap 属性与 bitmap一致
alterBitemp = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),bitmap.getConfig());
System.out.println(bitmap.getWidth()+" :"+bitmap.getHeight());
//画布
canvas = new Canvas(alterBitemp);
//canvas.drawBitmap()画笔-合成模式
colorMatrix = new ColorMatrix();
paint = new Paint();
paint.setColor(Color.BLACK);
//设置画笔过滤器-new()的颜色矩阵
paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
// paint.setXfermode(new PorterDuffXfermode(android.graphics.PorterDuff.Mode.MULTIPLY));
//画出来-两张图片-位置基于左上角
// paint.setAntiAlias(ture);//利用算法消除旋转锯齿
canvas.drawBitmap(bitmap, new Matrix(), paint);
canvas.drawBitmap(ic_luncher, new Matrix(), paint);
//-------------
//显示imageView
iv.setImageBitmap(alterBitemp);
}
/**
* 初始化sdcard信息,创建保存文件的目录
*/
private void initSdcard() {
//判断是否有SD卡,没有则创建新的
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
File file = new File(DATA_PATH);
File fileVideo = new File(DATA_PATH_VIDEO);
if(!file.exists()){
file.mkdir();
Toast.makeText(getApplicationContext(), "创建sdcard/image目录", 1).show();
}
if(!fileVideo.exists()){
fileVideo.mkdir();
Toast.makeText(getApplicationContext(), "创建sdcard/video目录", 1).show();
}
}
}
/**
* Red
*/
class seekBar1Listen implements OnSeekBarChangeListener{
@Override
public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {
// int progress1 = seekBar1.getProgress();//停止时的进度
colorMatrix.set(new float[]{ //值表示颜色变成原来几倍
progress/128.0f,0,0,0,0,
0,1,0,0,0,
0,0,1,0,0,
0,0,0,1,0,
});
//设置画笔过滤器-new()的颜色矩阵
paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
//---------
canvas.drawBitmap(bitmap, new Matrix(), paint);
canvas.drawBitmap(ic_luncher, new Matrix(), paint);
//显示imageView
iv.setImageBitmap(alterBitemp);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
}
/**
* blue
*/
class seekBar2Listen implements OnSeekBarChangeListener{
@Override
public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {
// int progress2 = seekBar1.getProgress();//停止时的进度
// 值表示颜色变成原来几倍 -中间128/128 原图
colorMatrix.set(new float[]{
1,0,0,0,0,
0,progress/128.0f,0,0,0,
0,0,1,0,0,
0,0,0,1,0,
});
//设置画笔过滤器-new()的颜色矩阵
paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
//---------
canvas.drawBitmap(bitmap, new Matrix(), paint);
canvas.drawBitmap(ic_luncher, new Matrix(), paint);
//显示imageView
iv.setImageBitmap(alterBitemp);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
}
/**
* green
*/
class seekBar3Listen implements OnSeekBarChangeListener{
@Override
public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {
// int progress3 = seekBar1.getProgress();//停止时的进度
// 值表示颜色变成原来几倍 -中间128/128 原图
colorMatrix.set(new float[]{
1,0,0,0,0,
0,1,0,0,0,
0,0,progress/128.0f,0,0,
0,0,0,1,0,
});
//设置画笔过滤器-new()的颜色矩阵
paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
//---------
canvas.drawBitmap(bitmap, new Matrix(), paint);
canvas.drawBitmap(ic_luncher, new Matrix(), paint);
//显示imageView
iv.setImageBitmap(alterBitemp);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
}
/**
* 对比度:饱和度
* 简单api:0.5f 表示饱和度时原来1/2
* ColorMatrix colorMatrix = new ColorMatrix();
* colorMatrix.setSaturation(0.5f);
* paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
*/
class seekBar4Listen implements OnSeekBarChangeListener{
@Override
public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {
// int progress3 = seekBar1.getProgress();//停止时的进度
// 值表示颜色变成原来几倍 -中间128/128 原图
colorMatrix.set(new float[]{
progress/128.0f,0,0,0,0,
0,progress/128.0f,0,0,0,
0,0,progress/128.0f,0,0,
0,0,0,1,0,
});
//设置画笔过滤器-new()的颜色矩阵
paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
//---------
canvas.drawBitmap(bitmap, new Matrix(), paint);
canvas.drawBitmap(ic_luncher, new Matrix(), paint);
//显示imageView
iv.setImageBitmap(alterBitemp);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {}
}
//拍照按钮监听
public void MyCamer(View v){
//激活系统相机拍照
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.addCategory("android.intent.category.DEFAULT");
//filename:生成的图片名称
filename = System.currentTimeMillis()+".jpg";
Uri uri = Uri.fromFile(new File(DATA_PATH+filename));
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent,REQUESTCODE);
//startActivity(intent);
}
/**
* 选择相册图片
*/
public void selectImageBut(View v){
//intent 集合系统图库应用,选择照片
Intent intent = new Intent();
intent.setAction(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, REQUESTCODE_SELECT_IMAGE);
}
/**
* 录像机实现
*/
public void MyVideo(View v){
Intent intent = new Intent("android.media.action.VIDEO_CAPTURE");
intent.addCategory("android.intent.category.DEFAULT");
//filename:录像视频文件保存的路径
filename = System.currentTimeMillis()+".3gp";
Uri uri = Uri.fromFile(new File(DATA_PATH_VIDEO+filename));
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivity(intent);
}
/**
* 保存修改的Bitmap图片
* 创建保存的图片-文件输出流-Bitemp.compress(格式,压缩比,fOut);
*/
public void SaveBitmapBut(View v){
File filePath= new File(DATA_PATH+System.currentTimeMillis()+".jpg");
FileOutputStream Fout = null;
try {
filePath.createNewFile();
Fout = new FileOutputStream(filePath);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(this, "文件创建输出流失败", 0).show();
}
alterBitemp.compress(Bitmap.CompressFormat.JPEG, 100, Fout);
try {
Fout.flush();
Fout.close();
Toast.makeText(this, "保存图像成功", 0).show();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取被激活的activity返回的值--startActivityForResult()
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Toast.makeText(getApplicationContext(), "in onActivityResult success", 1).show();
//拍照-REQUESTCODE=1
if(resultCode==RESULT_OK && requestCode==REQUESTCODE){
iv.setImageURI(Uri.parse(DATA_PATH+filename));
canvasBitmap(DATA_PATH+filename);//调用画布
}
//选择相册-REQUESTCODE_SELECT_IMAGE=2
if(resultCode==RESULT_OK && requestCode==REQUESTCODE_SELECT_IMAGE){
//图片uri路径 -gallery 图库程序源代码
Uri uri = data.getData();
iv.setImageURI(uri);
String fileName = getAbsoluteImagePath(uri);
System.out.println(fileName);
canvasBitmap(fileName);//调用画布
}
}
/**
* 获取uri绝对路径
* @param uri 传入的uri
* @return String 绝对路径
*/
protected String getAbsoluteImagePath(Uri uri)
{
// can post image
String [] proj={MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery( uri,
proj, // Which columns to return
null, // WHERE clause; which rows to return (all rows)
null, // WHERE clause selection arguments (none)
null); // Order-by clause (ascending by name)
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.imagetoimage.MainActivity" >
<SeekBar
android:id="@+id/seekBar1"
android:max="255"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:onClick="seekBar1Listen"/>
<SeekBar
android:id="@+id/seekBar2"
android:max="255"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/seekBar1"
android:onClick="seekBar2Listen"/>
<SeekBar
android:id="@+id/seekBar3"
android:max="255"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/seekBar2"
android:onClick="seekBar3Listen"/>
<SeekBar
android:id="@+id/seekBar4"
android:max="255"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/seekBar3"
android:onClick="seekBar4Listen" />
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/seekBar4"
android:layout_alignParentBottom="true" />
</RelativeLayout>
Code and App:http://pan.baidu.com/s/1bnGlVbx