在实际项目开发中,有时会遇到拍照,对照片进行剪切,压缩保存等一些功能,别的不扯,代码上:
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"/>
说得很少,有代码就行