更换背景——从相册或相机中获取图片并截取

来源:互联网 发布:按键精灵 数组直接赋值 编辑:程序博客网 时间:2024/06/05 13:30


参考 http://blog.csdn.net/floodingfire/article/details/8144587

关键在于裁剪的调用及返回:

Exta Options Table for image/* crop:附加选项数据类型描述cropString发送裁剪信号aspectXintX方向上的比例aspectYintY方向上的比例outputXint裁剪区的宽outputYint裁剪区的高scaleboolean是否保留比例return-databoolean是否将数据保留在Bitmap中返回dataParcelable相应的Bitmap数据circleCropString圆形裁剪区域?MediaStore.EXTRA_OUTPUT ("output")URI将URI指向相应的file:///...,详见代码示例
         现在,最令人困惑的是MediaStore.EXTRA_OUTPUT以及return-data选项。 
        你主要有两种方式从这个Intent中取得返回的bitmap:获取内部数据或者提供一个Uri以便程序可以将数据写入。 

        方法1:如果你将return-data设置为“true”,你将会获得一个与内部数据关联的Action,并且bitmap以此方式返回:(Bitmap)extras.getParcelable("data")。注意:如果你最终要获取的图片非常大,那么此方法会给你带来麻烦,所以你要控制outputX和outputY保持在较小的尺寸。鉴于此原因,在我的代码中没有使用此方法((Bitmap)extras.getParcelable("data"))。

        下面是CropImage.java的源码片段: 

1// Return the cropped image directly or save it to the specified URI.
2Bundle myExtras = getIntent().getExtras();
3if (myExtras != null && (myExtras.getParcelable("data") != null|| myExtras.getBoolean("return-data")))
4{
5    Bundle extras = new Bundle();
6    extras.putParcelable("data", croppedImage);
7    setResult(RESULT_OK,(new Intent()).setAction("inline-data").putExtras(extras));
8    finish();
9}
          方法2: 如果你将return-data设置为“false”,那么在onActivityResult的Intent数据中你将不会接收到任何Bitmap,相反,你需要将MediaStore.EXTRA_OUTPUT关联到一个Uri,此Uri是用来存放Bitmap的。 

但是还有一些条件,首先你需要有一个短暂的与此Uri相关联的文件地址,当然这不是个大问题(除非是那些没有sdcard的设备)。

         下面是CropImage.java关于操作Uri的源码片段: 

01if (mSaveUri != null) {
02    OutputStream outputStream = null;
03    try {
04        outputStream = mContentResolver.openOutputStream(mSaveUri);
05        if (outputStream != null) {
06            croppedImage.compress(mOutputFormat, 75, outputStream);
07        }
08    catch (IOException ex) {
09        // TODO: report error to caller
10        Log.e(TAG, "Cannot open file: " + mSaveUri, ex);
11    finally {
12        Util.closeSilently(outputStream);
13    }
14    Bundle extras = new Bundle();
15    setResult(RESULT_OK, new Intent(mSaveUri.toString()).putExtras(extras));
16}
 示例代码:

<pre name="code" class="java">private static final int REQUEST_CHANGE_FROM_CAMERA_MASK = 0x10;//拍照修改private static final int REQUEST_CHANGE_FROM_ALBUM_MASK  = 0x20;//从相册中获取图片修改private static final int FLAG_LITTLE = 0x1;//小图方式private static final int FLAG_BIG = 0x2;//小图方式/** * 从相册中获取图片 * @param requestCode */private void getFromAlbum(int requestCode) {Intent intent = new Intent(Intent.ACTION_GET_CONTENT);intent.addCategory(Intent.CATEGORY_OPENABLE);intent.setType("image/*");startActivityForResult(intent, requestCode);}/** * 拍照获取图片 * @param requestCode */private void getFromCamera(int requestCode) {Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//tmpFileName = System.currentTimeMillis()+".jpg";intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(getExternalCacheDir(), "sample.jpg")));//拍照完自动保存到外置sd卡的缓存目录中startActivityForResult(intent, requestCode);}private void startCropPhoto(Uri uri, int requestCode) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*"); intent.putExtra("crop", "true");intent.putExtra("aspectX", 1);//宽高比1:1intent.putExtra("aspectY", 1);intent.putExtra("scale", true);intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true);if(requestCode == FLAG_LITTLE){//小图片        intent.putExtra("outputX", 100);//截取尺寸大小         intent.putExtra("outputY", 100);        intent.putExtra("return-data", true);//返回Bitmap}else if(requestCode == FLAG_BIG){//大图片intent.putExtra("outputX", 400);  intent.putExtra("outputY", 400);intent.putExtra("return-data", false);//不返回,直接保存为文件intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(getExternalFilesDir(null), "sample.jpg")));}else{return;}        startActivityForResult(intent, requestCode);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if(resultCode == RESULT_OK){switch(requestCode){//来自相册回调case FLAG_LITTLE + REQUEST_CHANGE_FROM_ALBUM_MASK:case FLAG_BIG  + REQUEST_CHANGE_FROM_ALBUM_MASK:Uri uri = data.getData();startCropPhoto(uri, requestCode - REQUEST_CHANGE_FROM_ALBUM_MASK);break;//来自相机回调case  FLAG_LITTLE + REQUEST_CHANGE_FROM_CAMERA_MASK:case  FLAG_BIG  + REQUEST_CHANGE_FROM_CAMERA_MASK:startCropPhoto(Uri.fromFile(new File(getExternalCacheDir(), "sample.jpg")),requestCode - REQUEST_CHANGE_FROM_CAMERA_MASK);break;case FLAG_LITTLE:Bitmap photo = data.getExtras().getParcelable("data");//截图后返回的是小图BitmapsaveImage(photo, "sample.jpg");//保存图片loadImage("sample.jpg");//载入新图片break;case FLAG_BIG ://截图后返回(图片在截取后已经自动保存到文件中了)loadImage("sample.jpg");break;}}}private void saveImage(Bitmap photo, String pic_name){try {//保存图像到外置SD卡中FileOutputStream bgOutput = new FileOutputStream(new File(getExternalFilesDir(null), pic_name));photo.compress(Bitmap.CompressFormat.JPEG, 100, bgOutput);bgOutput.flush();bgOutput.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}private boolean loadImage(String pic_name) {try {FileInputStream openFileInput = new FileInputStream(new File(getExternalFilesDir(null), pic_name));imageView.setBackgroundDrawable(new BitmapDrawable(getResources(), BitmapFactory.decodeStream(openFileInput)));//imageView.setImageBitmap(BitmapFactory.decodeStream(openFileInput));openFileInput.close();return true;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return false;}调用://从相册中获取小图getFromAlbum(REQUEST_CHANGE_FROM_ALBUM_MASK + FLAG_LITTLE);//从相册中获取大图getFromAlbum(REQUEST_CHANGE_FROM_ALBUM_MASK + FLAG_BIG);//拍照获取小图(拍出来的照片一般都是大图)//getFromCamera(REQUEST_CHANGE_FROM_CAMERA_MASK + FLAG_LITTLE);//拍照获取大图getFromCamera(REQUEST_CHANGE_FROM_CAMERA_MASK + FLAG_BIG);


文件下载:http://download.csdn.net/detail/langrenfengzi/7864693


0 0