如何使用Android MediaStore裁剪大图片

译者按:在外企工作的半年多中花了不少时间在国外的网站上搜寻资料,其中有一些相当有含金量的文章,我会陆陆续续翻译成中文,与大家共享之。初次翻译,“信达雅”三境界恐怕只到信的层次,望大家见谅!

这篇文章相当经典而实用,想当初我做手机拍照截图的时候,大多都是在网上抄来抄去的内容,从来没有人考虑过实际项目中的需求。实际上,拍照传大图片,如果用普通方式会耗用极大的内存,Android一个App原则上的16M内存限制可以一下子被耗光。Android在拍照上有一个隐藏的设计,如果拍照图片过大,只返回一张缩略图。具体到不同手机,都是不一样的。

-------------------------------------------------------------------------------------

译文:

概述

我写这篇文章是为了发表我对MediaStore裁剪图片功能的一些简要研究。基本上,如果你要写一个应用程序,使用已有的Media Gallery并允许用户在你的应用里选取TA的图片的一部分(可选功能:人脸识别)。 可以使用一个Intent做到这个,但是也存在着相应的问题,总的来说也缺少这方面的文档告诉我们怎么实现它。 另外,这篇文章基于2.1并且在Nexus One上做了测试。 Nexus One上的实现似乎被这群人写在了这里: Media Gellery for Nexus One 。

反馈

这篇文章需要使用基于我的研究所写的程序。如果你对我推荐的实现方案有所改进,请让我知道。我会相应的更新这篇文章。

Intent细节

首先,让我们探讨下Intent以及它的特点。在看了一些代码示例以后,我发现我可以很轻松的使用如下的Intent调用裁剪功能:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
intent.setType(“image/*”);
intent.putExtra(“crop”, “true”);

然而,这是在我缺少附加的文档,不知道这些选项的具体含义等等情况之下的选择。所以,我将我的yanj整理成一个表格 ,并写了一个演示程序,力图演示控制此功能的所有可供选项。

你可以在你的程序中使用使用我的代码,并且扩展它。我会将之附加在这篇文章上。

Exta Options Table for image/* crop:

附加选项   数据类型   描述  
crop   String   发送裁剪信号  
aspectX   int   X方向上的比例  
aspectY   int   Y方向上的比例  
outputX   int   裁剪区的宽  
outputY   int   裁剪区的高  
scale   boolean   是否保留比例  
return-data   boolean   是否将数据保留在Bitmap中返回  
data   Parcelable   相应的Bitmap数据  
circleCrop   String   圆形裁剪区域?  
MediaStore.EXTRA_OUTPUT ("output")   URI   将URI指向相应的file:///...,详见代码示例  

现在,最令人困惑的是MediaStore.EXTRA_OUTPUT以及return-data选项。

你主要有两种方式从这个Intent中取得返回的bitmap:获取内部数据或者提供一个Uri以便程序可以将数据写入。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/8eee9d73d9b609274737228a0df53bcd.html