android 拍照并压缩,Android Camera拍照 压缩

本文介绍了如何在Android应用中使用Intent启动相机拍摄照片,并处理照片捕获、显示、裁剪及压缩的过程。重点讲解了如何设置输出路径、启动裁剪功能以及图片质量控制的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

packagecom.carloz.invokecamera;importandroid.content.ContentValues;importandroid.content.Intent;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;importandroid.net.Uri;importandroid.os.Bundle;importandroid.os.Environment;importandroid.os.SystemClock;importandroid.provider.MediaStore;importandroid.support.v7.app.ActionBarActivity;importandroid.util.Log;importandroid.view.View;importandroid.widget.Button;importandroid.widget.ImageView;importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.InputStream;public class InvokeCameraActivity extendsActionBarActivity {private String TAG = "CARLOZ";privateImageView iv;privateButton button;privateFile file;privateUri uri;

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_invoke_camera);

iv=(ImageView) findViewById(R.id.imageView1);

button=(Button) findViewById(R.id.button1);

file= new File("/data/sdcard/DCIM/Camera/carloz.jpg");

uri=Uri.fromFile(file);//String imageName = "carlo" + System.currentTimeMillis();//ContentValues values = new ContentValues();//values.put(MediaStore.Images.Media.TITLE, imageName);//values.put(MediaStore.Images.Media.DISPLAY_NAME, imageName+".ipg");//values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpg");//uri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);

Log.d(TAG,"onCreate - uri: " +uri);

button.setOnClickListener(newView.OnClickListener() {

@Overridepublic voidonClick(View v) {

Intent intent= newIntent();

intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//intent.putExtra(MediaStore.Images.Media.ORIENTATION, 0);

intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

startActivityForResult(intent,3);

}

});

}

@Overrideprotected void onActivityResult(int requestCode, intresultCode, Intent data) {

Log.d(TAG,"onActivityResult requestCode=" +requestCode+ ", resultCode=" +resultCode+ ", data=" +data);if (resultCode ==RESULT_OK) {switch(requestCode) {case 1:

iv.setImageURI(uri);break;case 2:

startPhotoZoom(uri);break;case 3:try{

Log.d(TAG,"onActivityResult BitmapFactory filepath: " +file.getAbsolutePath());//BitmapFactory.Options options = new BitmapFactory.Options();//options.inSampleSize = 2;

InputStream is = new FileInputStream(file.getAbsolutePath());//读出指定的文件,二进制流

Bitmap bitmap =BitmapFactory.decodeStream(is);//Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());//bitmap = compressImage(bitmap,500);

if (bitmap != null) {

Log.d(TAG,"onActivityResult bitmap != null");

iv.setImageBitmap(bitmap);

}else{

Log.d(TAG,"onActivityResult - bitmap is null");

}

is.close();

}catch(Exception e) {//TODO: handle exception

Log.d(TAG, "onActivityResult - BitmapFactory Exception: " +e.toString());

}break;default:

Log.d(TAG,"onActivityResult - request code not define !");break;

}

}else{

Log.d(TAG,"onActivityResult - RESULT NOT OK");

}super.onActivityResult(requestCode, resultCode, data);

}/*** 裁剪图片

*

*@paramuri*/

public voidstartPhotoZoom(Uri uri) {

Log.d(TAG,"startPhotoZoom - uri: " +uri.toString());

Intent intent= new Intent("com.android.camera.action.CROP");

intent.setDataAndType(uri,"image/*");

intent.putExtra("crop", "true");//crop=true 有这句才能出来最后的裁剪页面.

intent.putExtra("aspectX", 1);//这两项为裁剪框的比例.

intent.putExtra("aspectY", 1);//x:y=1:1

intent.putExtra("outputX", 200);//图片输出大小

intent.putExtra("outputY", 200);

intent.putExtra("output", uri);

intent.putExtra("outputFormat", "jpg");//返回格式

startActivityForResult(intent, 3);

}/*** 将图片image压缩成大小为 size的图片(size表示图片大小,单位是KB)

*

*@paramimage 图片资源

*@paramsize 图片大小

*@returnBitmap*/

private Bitmap compressImage(Bitmap image, intsize) {

Log.d(TAG,"compressImage - size: " +size);

ByteArrayOutputStream baos= newByteArrayOutputStream();//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中

image.compress(Bitmap.CompressFormat.JPEG, 100, baos);int options = 100;//循环判断如果压缩后图片是否大于100kb,大于继续压缩

while (baos.toByteArray().length / 1024 >size) {//重置baos即清空baos

baos.reset();//每次都减少10

options -= 10;//这里压缩options%,把压缩后的数据存放到baos中

image.compress(Bitmap.CompressFormat.JPEG, options, baos);

}//把压缩后的数据baos存放到ByteArrayInputStream中

ByteArrayInputStream isBm = newByteArrayInputStream(baos.toByteArray());//把ByteArrayInputStream数据生成图片

Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);returnbitmap;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值