Android拍照压缩裁剪并保存图片

在实际项目开发中,有时会遇到拍照,对照片进行剪切,压缩保存等一些功能,别的不扯,代码上:

package com.example.cameratest;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {
	//创建ImageView
	private ImageView imageView;
	//创建Bitmap对象
	private Bitmap bitmap;
	//文件保存目录
	private File saveCatalog;
	//保存的文件
	private File saveFile;
	//文件保存目录字符串
	String path=Environment.getExternalStorageDirectory().getPath()+"/Zeny";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//取消标题
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.activity_main);
		//获取ImageView对象
		imageView=(ImageView) this.findViewById(R.id.imageView);
		//创建文件保存目录
		saveCatalog=new File(path);
		if(!saveCatalog.exists()){
			//创建目录
			saveCatalog.mkdirs();
		}
	}
	
	/**
	 * 拍照按钮
	 */
	public void openCamera(View view){
		//创建一个意图
		Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
		//创建保存图片文件File
		saveFile=new File(saveCatalog,"image.jpg");
		if(!saveFile.exists()){
			try {
				//创建文件
				saveFile.createNewFile();
			} catch (IOException e) {
				Toast.makeText(this, "创建文件失败!", Toast.LENGTH_SHORT).show();
			}
		}
		intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(saveFile));
		startActivityForResult(intent, 3);
	}
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if(resultCode==RESULT_OK){
			switch (requestCode) {
			//保存后调用,裁剪
			case 1:
				//创建裁剪的意图
				Intent intent=new Intent("com.android.camera.action.CROP");
				try{
					intent.setData(Uri.parse(android.provider.MediaStore.Images.Media.insertImage(getContentResolver(), saveFile.getPath(), null, null)));
				}catch(Exception e){
					e.printStackTrace();
				}
				intent.putExtra("crop", "true");
				intent.putExtra("aspectX", 3);
				intent.putExtra("aspectY", 2);
				intent.putExtra("outputX", 110);
				intent.putExtra("outputY", 110);
				intent.putExtra("return-data", true);
				startActivityForResult(intent, 2);
				//获取保存的图片
				saveFile=new File(saveCatalog,"image.jpg");
				//如果存在,则删除
				if(saveFile.exists())
					//删除文件
					saveFile.delete();
				break;
			//剪切后显示图片,并保存图片
			case 2:
				Bundle extras=data.getExtras();
				if(extras!=null){
					//获取Bitmap对象
					bitmap=extras.getParcelable("data");
				}
				//压缩图片
				try {
					//创建FileOutputStream对象
					FileOutputStream fos=new FileOutputStream(saveFile);
					//开始压缩图片
					if(bitmap.compress(Bitmap.CompressFormat.JPEG, 50, fos)){
						fos.flush();
						//关闭流对象
						fos.close();
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
				//将图片显示到ImageView中
				imageView.setImageBitmap(bitmap);
				break;
			//压缩图片显示
			case 3:
				//创建Options对象
				BitmapFactory.Options opts=new BitmapFactory.Options();
				bitmap=BitmapFactory.decodeFile(saveFile.getPath(), opts);
				bitmap=comp(bitmap);
				//将图片显示到ImageView中
				imageView.setImageBitmap(bitmap);
				break;
			}
		}
		super.onActivityResult(requestCode, resultCode, data);
	}
	/**
	 * 压缩图片显示
	 */
	private Bitmap comp(Bitmap image) {
		
		ByteArrayOutputStream baos = new ByteArrayOutputStream();		
		image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
		if( baos.toByteArray().length / 1024>1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出	
			baos.reset();//重置baos即清空baos
			image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩50%,把压缩后的数据存放到baos中
		}
		ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
		BitmapFactory.Options newOpts = new BitmapFactory.Options();
		//开始读入图片,此时把options.inJustDecodeBounds 设回true了
		newOpts.inJustDecodeBounds = true;
		Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
		newOpts.inJustDecodeBounds = false;
		int w = newOpts.outWidth;
		int h = newOpts.outHeight;
		float hh = 100f;//这里设置高度为100f
		float ww = 100f;//这里设置宽度为100f
		int be = 1;//be=1表示不缩放
		if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放
			be = (int) (newOpts.outWidth / ww);
		} else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放
			be = (int) (newOpts.outHeight / hh);
		}
		if (be <= 0)
			be = 1;
		newOpts.inSampleSize = be;//设置缩放比例
		//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了
		isBm = new ByteArrayInputStream(baos.toByteArray());
		bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);
		return compressImage(bitmap);//压缩好比例大小后再进行质量压缩
	}
	private Bitmap compressImage(Bitmap image) {

		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
		int options = 100;
		while ( baos.toByteArray().length / 1024>100) {	//循环判断如果压缩后图片是否大于100kb,大于继续压缩		
			baos.reset();//重置baos即清空baos
			image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
			options -= 10;//每次都减少10
		}
		ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
		Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
		return bitmap;
	}
}

当然是用相机,和读取文件还需要权限才能完成的

 <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
说得很少,有代码就行


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小老虎Love

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值