图像变换和触摸画图

本文介绍了使用Android实现图形变换和颜色矩阵应用的实例,包括图像旋转、缩放、颜色对比增强与亮度调整,以及手写板笔迹画图功能。
package com.example.test;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import android.app.Activity;
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.PorterDuff.Mode;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class Test extends Activity implements OnTouchListener{
	private static String TAG = "MediaStore";
	boolean isFirst = true;
	
	ImageView imageView1;
	ImageView imageView2;
	ImageView imageView3;
	View screem;
	
	Canvas canvas_in;
	Paint paint_in;
	Bitmap bitmap_in ;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
	/******************图形变换矩阵****************************/
		
		imageView1 = (ImageView) findViewById(R.id.alterImage);
		Bitmap src = BitmapFactory.decodeResource(getResources(), R.drawable.abc12345);
		Matrix matrix = new Matrix();
		matrix.setRotate(15, src.getWidth()/2, src.getHeight()/2); //图像中心旋转
		Bitmap bitmap = Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, false);
		
		Matrix matrix2 = new Matrix();
		matrix2.setScale(0.5f, 0.5f); 
		matrix2.postRotate(15, src.getWidth()/2, src.getHeight()/2); // 如果先缩放再旋转需要用postRotate()
		
		/*******************颜色矩阵***************************/
		
		imageView2 = (ImageView) findViewById(R.id.alterColorImage);
		ColorMatrix colorMatrix = new ColorMatrix();
		
		float contrast = 1.5f;  //颜色对比增强
		float brightness = -25;  //亮度,一般图像对比增强亮度就减少
		colorMatrix.set(new float[]{
				contrast, 0, 0, 0, brightness,
				0, contrast, 0, 0, brightness,
				0, 0, contrast, 0, brightness,
				0, 0, 0, contrast, 0,				
		});
		
		Bitmap bmp1 = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Bitmap.Config.RGB_565); //创建空白bitmap
		Canvas canvas = new Canvas(bmp1); //创建画布
		Paint paint = new Paint();
		paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix)); //画笔加上颜色矩阵
		canvas.drawBitmap(src, 0, 0, paint);
		
		imageView1.setImageBitmap(src);
		imageView2.setImageBitmap(bmp1);
		
		write2file(bmp1, "12345.jpg");
		
		/***************手写板笔迹画图******************/
		screem = findViewById(R.id.screem);
		screem.setOnTouchListener(this);
		
		bitmap_in = Bitmap.createBitmap(src.getWidth(), src.getHeight(), Bitmap.Config.RGB_565);
		canvas_in = new Canvas(bitmap_in);
		paint_in = new Paint();
		paint_in.setColor(Color.WHITE);
		paint_in.setStyle(Paint.Style.FILL_AND_STROKE); // 轮廓加填充
		paint_in.setStrokeWidth(2);
		
		imageView3 = (ImageView) findViewById(R.id.putIn);
		imageView3.setImageBitmap(bitmap_in);
		imageView3.setOnTouchListener(this);
		
	}

	float downx = 0;
	float downy = 0;
	float upx = 0;
	float upy = 0;
	@Override
	public boolean onTouch(View v, MotionEvent event) {
		
		if (v.getId() == R.id.screem) {	  //点击屏幕出现手写板
			imageView3.setVisibility(View.VISIBLE);
			if(v.getId() != R.id.putIn) { //点击其他其他区域重置画布

				Paint clearPaint = new Paint();
				canvas_in.drawPaint(clearPaint);
				//canvas_in.drawColor(0, Mode.CLEAR); // 两种方法都可以
				
				imageView3.invalidate();
			}
		}
		if (v.getId() == R.id.putIn) {
			switch (event.getAction()) {
			
				case MotionEvent.ACTION_DOWN:
					downx = event.getX();
					downy = event.getY();
					break;
	
				case MotionEvent.ACTION_UP:
					break;
	
				case MotionEvent.ACTION_MOVE:
					upx = event.getX();
					upy = event.getY();
					canvas_in.drawLine(downx, downy, upx, upy, paint_in);
					imageView3.invalidate();
					downx = upx;
					downy = upy;
					break;
	
				case MotionEvent.ACTION_CANCEL:
					break;
			}
		}
		return true; //must be true
	}
	
	
	/**
	 * bitmap 位图写成文件
	 * @param bmp1 位图
	 * @param name 文件名
	 */
	private void write2file(Bitmap bmp1 , String name) {
		File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath().toString()  + File.separator, name);
		try {
			file.createNewFile();
			OutputStream os = new FileOutputStream(file);
			bmp1.compress(Bitmap.CompressFormat.JPEG, 100, os);
			os.flush();
			System.out.println("writeFile");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
}


转载于:https://my.oschina.net/u/555002/blog/73323

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值