由于业务需要写了一个Android手机拍照的功能Demo,同时实现了图片剪裁和图片压缩。以下是源码


packagecom.klp.demo_025;importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.FileOutputStream;importandroid.app.Activity;importandroid.content.Intent;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;importandroid.net.Uri;importandroid.os.Bundle;importandroid.provider.MediaStore;importandroid.view.View;importandroid.widget.Button;importandroid.widget.ImageView;publicclassMainActivityextendsActivity{privateImageViewiv;privateButtonbutton;privateFilefile;privateUriuri;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);iv=(ImageView)findViewById(R.id.p_w_picpathView1);button=(Button)findViewById(R.id.button1);file=newFile(this.getExternalFilesDir(null),"p_w_picpath.jpg");uri=Uri.fromFile(file);button.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){//TODOAuto-generatedmethodstubIntentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(MediaStore.Images.Media.ORIENTATION,0);intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);startActivityForResult(intent,2);}});}@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){//TODOAuto-generatedmethodstubsuper.onActivityResult(requestCode,resultCode,data);if(resultCode==RESULT_OK){if(requestCode==2){startPhotoZoom(uri);}else{try{BitmapFactory.Optionsoptions=newBitmapFactory.Options();options.inSampleSize=2;Bitmapbitmap=BitmapFactory.decodeFile(file.getPath(),options);//压缩图片//bitmap=compressImage(bitmap,500);if(bitmap!=null){//显示图片iv.setImageBitmap(bitmap);//保存图片FileOutputStreamfos=null;fos=newFileOutputStream(file);bitmap.compress(Bitmap.CompressFormat.JPEG,100,fos);fos.flush();fos.close();}}catch(Exceptione){//TODO:handleexception}}}}/***裁剪图片**@paramuri*/publicvoidstartPhotoZoom(Uriuri){Intentintent=newIntent("com.android.camera.action.CROP");intent.setDataAndType(uri,"p_w_picpath/*");intent.putExtra("crop","true");//crop=true有这句才能出来最后的裁剪页面.intent.putExtra("aspectX",1);//这两项为裁剪框的比例.intent.putExtra("aspectY",1);//x:y=1:1intent.putExtra("outputX",200);//图片输出大小intent.putExtra("outputY",200);intent.putExtra("output",uri);intent.putExtra("outputFormat","JPEG");//返回格式startActivityForResult(intent,3);}/***将图片p_w_picpath压缩成大小为size的图片(size表示图片大小,单位是KB)**@paramp_w_picpath*图片资源*@paramsize*图片大小*@returnBitmap*/privateBitmapcompressImage(Bitmapp_w_picpath,intsize){ByteArrayOutputStreambaos=newByteArrayOutputStream();//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中p_w_picpath.compress(Bitmap.CompressFormat.JPEG,100,baos);intoptions=100;//循环判断如果压缩后图片是否大于100kb,大于继续压缩while(baos.toByteArray().length/1024>size){//重置baos即清空baosbaos.reset();//每次都减少10options-=10;//这里压缩options%,把压缩后的数据存放到baos中p_w_picpath.compress(Bitmap.CompressFormat.JPEG,options,baos);}//把压缩后的数据baos存放到ByteArrayInputStream中ByteArrayInputStreamisBm=newByteArrayInputStream(baos.toByteArray());//把ByteArrayInputStream数据生成图片Bitmapbitmap=BitmapFactory.decodeStream(isBm,null,null);returnbitmap;}}

下面是布局,很简单

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="${relativePackage}.${activityClass}"><ImageViewandroid:id="@+id/p_w_picpathView1"android:layout_width="200dp"android:layout_height="200dp"android:layout_alignParentTop="true"android:layout_centerHorizontal="true"android:layout_marginTop="64dp"android:src="@drawable/ic_launcher"/><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/p_w_picpathView1"android:layout_centerHorizontal="true"android:layout_marginTop="32dp"android:text="拍照"/></RelativeLayout>

最后注意,一定要在AndroidManifest.xml添加SD卡访问权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>