Android基础学习__第7天__图片的各种处理


1.加载大图片到内存

    数码相机照片特别大3m以上,内存吃不消,只能将原图进行缩放显示

1).通过BitmapFactory.Options 来实现,只显示原图的1/8

BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
bmpFactoryOptions.inSampleSize = 8;
Bitmap bmp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions);
imv.setImageBitmap(bmp);
2).根据当前屏幕分辨率的大小,加载图片
//得到手机屏幕的宽高.
WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
windowheight = wm.getDefaultDisplay().getHeight();
windowwidth= wm.getDefaultDisplay().getWidth();

BitmapFactory.Options opts = new Options();
//不去真的解析图片 只是获取图片的头部信息  宽高
opts.inJustDecodeBounds = true;
BitmapFactory.decodeFile("/sdcard/a.jpg", opts);
int imageHeight = opts.outHeight ;
int imageWidth  = opts.outWidth;
System.out.println("图片宽:"+imageWidth);
System.out.println("图片高:"+imageHeight);

//计算缩放比例
int scaleX = imageWidth/windowwidth;
int scaleY = imageHeight /windowheight;
int scale = 1;
if(scaleX > scaleY  & scaleY >=1){
	scale = scaleX;
}
if(scaleY > scaleX  & scaleX >=1){
	scale = scaleY;
}
//真的解析图片
opts.inJustDecodeBounds = false;
//采样率
opts.inSampleSize = scale;
Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/a.jpg", opts);
iv.setImageBitmap(bitmap);

2.获取exif信息

ExifInterface  exif = new ExifInterface("/sdcard/a.jpg");
String time = exif.getAttribute(ExifInterface.TAG_DATETIME);
System.out.println(time);
//得到拍摄设备型号
String model = exif.getAttribute(ExifInterface.TAG_MODEL);
System.out.println("model:"+model);

//把exif信息写到文件:
exif.setAttribute("ImageDescription","Something New");

3.从gallery获取图片

public void selectImage(View view) {
		// 激活系统的图库应用 选择一张照片
		Intent intent = new Intent();
		intent.setAction(Intent.ACTION_PICK);
		intent.setType("image/*");
		startActivityForResult(intent, 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	try {
		if (data != null) {
			Uri uri = data.getData(); // 图片的uri 路径
			iv.setImageURI(uri);//注意,如果图片过大,会异常
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
	super.onActivityResult(requestCode, resultCode, data);
}

4.图片画画板

// 注册imagview的触摸事件
iv.setOnTouchListener(new OnTouchListener() {
	int  startX = 0;
	int startY = 0;

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			System.out.println("手指按下");
			startX = (int) event.getX();
			startY = (int) event.getY();
			break;

		case MotionEvent.ACTION_MOVE:
			System.out.println("手指移动");
			int newX = (int) event.getX();
			int newY = (int) event.getY();
			System.out.println("开始画线:起点坐标:("+startX+","+startY+"), --->"+"("+newX+","+newY+")");
			canvas.drawLine(startX, startY, newX, newY, paint);
			iv.setImageBitmap(alterBitmap);
			//更新新的位置
			startX = (int) event.getX();
			startY = (int) event.getY();
			break;

		case MotionEvent.ACTION_UP:
					
			System.out.println("手指离开");
			break;
		}
		return true;
	}
});




//处理返回回来的数据。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	try {
		if (data != null) {
			Uri uri = data.getData(); // 图片的uri 路径
			InputStream is = getContentResolver().openInputStream(uri);
			//一个不可以被修改的bitmap  只读的bitmap
			Options opts = new Options();
			opts.inSampleSize = 2;
			Bitmap bitmap = BitmapFactory.decodeStream(is, new Rect(), opts);
			//创建一个空白可以被修改的bitmap 宽度 和高度 跟原图一样.
			alterBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), bitmap.getConfig());
				
				
			//初始化 画布  用什么bitmap 作为背景 创建一个一个画布
			canvas = new Canvas(alterBitmap);
			canvas.drawBitmap(bitmap, new Matrix(), paint);
			//初始化 画笔
			paint = new Paint();
			paint.setColor(Color.GREEN);
			paint.setStrokeWidth(6);
			// 缩略图Bitmap bitmap = data.getParcelableExtra("data");
					
			iv.setImageBitmap(alterBitmap);
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
	super.onActivityResult(requestCode, resultCode, data);
}
效果图:

5.图片的缩放、旋转、镜面、倒影

@Override
protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
	iv1 = (ImageView) findViewById(R.id.iv_1);
	iv2 = (ImageView) findViewById(R.id.iv_2);
		
	Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
	iv1.setImageBitmap(bitmap1);
		
	Bitmap alterBitmap = Bitmap.createBitmap(bitmap1.getWidth()*2, bitmap1.getHeight(), bitmap1.getConfig());
	Canvas canvas = new Canvas(alterBitmap);
	Paint paint = new Paint();
	paint.setColor(Color.BLACK);
	//矩阵
	Matrix matrix = new Matrix();
/*	matrix.setValues(new float[] {
			2.0f, 0, 0,
			0, 1, 0,
			0, 0, 1
		});*/

	--------
	//缩放效果
	matrix.setScale(2.0f, 1);//缩放
	--------
	//旋转效果
	matrix.setRotate(15,bitmap1.getWidth()/2,bitmap1.getHeight()/2);//旋转
	paint.setAntiAlias(true);//消除锯齿
	--------
	//镜面效果
	matrix.setScale(-1, 1);
	matrix.postTranslate(bitmap1.getWidth(), 0);*/
	--------
	//倒影效果
	matrix.setScale(1, -1);
	matrix.postTranslate(0, bitmap1.getHeight());
	--------
	canvas.drawBitmap(bitmap1, matrix, paint);
		
	iv2.setImageBitmap(alterBitmap);
}

6.图片的颜色修改

    关键类:ColorMatrix
public class MainActivity extends Activity {

	private ImageView iv1;
	private SeekBar sb1, sb2, sb3,sb4;
	private Bitmap alterBitmap;
	private Canvas canvas;
	private Paint paint;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		iv1 = (ImageView) findViewById(R.id.iv);

		final Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(),
				R.drawable.ic_launcher);

		 alterBitmap = Bitmap.createBitmap(bitmap1.getWidth(),
				bitmap1.getHeight(), bitmap1.getConfig());
		 canvas = new Canvas(alterBitmap);
		 paint = new Paint();
		paint.setColor(Color.BLACK);
		final Matrix matrix = new Matrix();
		final ColorMatrix cm = new ColorMatrix();
		paint.setColorFilter(new ColorMatrixColorFilter(cm));

		paint.setAntiAlias(true);
		canvas.drawBitmap(bitmap1, matrix, paint);

		iv1.setImageBitmap(alterBitmap);

		sb1 = (SeekBar) findViewById(R.id.sb1);
		sb2 = (SeekBar) findViewById(R.id.sb2);
		sb3 = (SeekBar) findViewById(R.id.sb3);
		sb4 = (SeekBar) findViewById(R.id.sb4);
		sb1.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				int progress = seekBar.getProgress();
				cm.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
						});
				paint.setColorFilter(new ColorMatrixColorFilter(cm));
				canvas.drawBitmap(bitmap1, matrix, paint);

				iv1.setImageBitmap(alterBitmap);
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {

			}

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {

			}
		});

		sb2.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				int progress = seekBar.getProgress();
				cm.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
						});
				paint.setColorFilter(new ColorMatrixColorFilter(cm));
				canvas.drawBitmap(bitmap1, matrix, paint);

				iv1.setImageBitmap(alterBitmap);
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {

			}

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {

			}
		});
		sb3.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				int progress = seekBar.getProgress();
				cm.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
						});
				paint.setColorFilter(new ColorMatrixColorFilter(cm));
				canvas.drawBitmap(bitmap1, matrix, paint);

				iv1.setImageBitmap(alterBitmap);
			}

			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {

			}

			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {

			}
		});
		
		sb4.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
			
			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				int progress = seekBar.getProgress();
				cm.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
						});
				paint.setColorFilter(new ColorMatrixColorFilter(cm));
				canvas.drawBitmap(bitmap1, matrix, paint);

				iv1.setImageBitmap(alterBitmap);
				
			}
			
			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
				// TODO Auto-generated method stub
				
			}
			
			@Override
			public void onProgressChanged(SeekBar seekBar, int progress,
					boolean fromUser) {
				// TODO Auto-generated method stub
				
			}
		});
	}
}

7.人脸识别

protected void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.activity_main);
	Bitmap faceBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.aa);
	FaceDetector detector = new FaceDetector(faceBitmap.getWidth(),
		faceBitmap.getHeight(), 1); // 创建识别器
	Face[] mFaces = new Face[1];
	int mNumFaces = detector.findFaces(faceBitmap, mFaces);
	// 识别
	if (mNumFaces > 0) {
		for (int i = 0; i < mNumFaces; i++) {
			System.out.println("找到了脸");
			PointF point = new PointF();
			mFaces[i].getMidPoint(point);
			System.out.println("脸的中心坐标:"+point.x+","+point.y);
		}
	}else{
		System.out.println("没找到了脸");
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值