图片颜色处理RGB-拍照-读取相册-保存修改的图片


//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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值