`

Android大图片裁剪终极解决方案(上:原理分析)(转)

 
阅读更多

http://blog.csdn.net/floodingfire/article/details/8144604

 

    约几个月前,我正为公司的APP在Android手机上实现拍照截图而烦恼不已。

    上网搜索,确实有不少的例子,大多都是抄来抄去,而且水平多半处于demo的样子,可以用来讲解知识点,但是一碰到实际项目,就漏洞百出。

    当时我用大众化的解决方案,暂时性的做了一个拍照截图的功能,似乎看起来很不错。问题随之而来,我用的是小米手机,在别的手机上都运行正常,小米这里却总是碰钉子。虽然我是个理性的米粉,但是也暗地里把小米的工程师问候了个遍。真是惭愧!

    翻文档也找不出个答案来,我一直对com.android.camera.action.CROP持有大大的疑问,它是从哪里来,它能干什么,它接收处理什么类型的数据?Google对此却讳莫如深,在官方文档中只有Intent中有只言片语言及,却不甚详尽。

    随着项目的驱动,我不能抱着不了解原理就不往前走的心态,唯一要做的,是解决问题。最后在德问上找到一条解决方案,说是哪怕是大米也没问题。当时乐呵呵将代码改了改,确实在所有的手机上跑起来了,一时如释重负,对这个的疑问也抛诸脑后了。

    直到月前,BOSS要求将拍照上传到服务器的图片分辨率加倍。OK,加倍简单,增加outputX以及outputY不就得了?

1 intent.putExtra("outputX", outputX);
2 intent.putExtra("outputY", outputY);

    这一增加,吓了我一跳。BOSS的手机拍到的照片几乎就是个缩略图,但是被我问候了全体工程师的小米在这个时候就体现出国产神机的范儿了,小米上的尺寸一切正常。这个为什么呢?我大致了解原因,却不知道如何解决。

    在Android中,Intent触发Camera程序,拍好照片后,将会返回数据,但是考虑到内存问题,Camera不会将全尺寸的图像返回给调用的Activity,一般情况下,有可能返回的是缩略图,比如120*160px。

    这是为什么呢?这不是一个Bug,而是经过精心设计的,却对开发者不透明。

    以我的小米手机为例,摄像头800W像素,根据我目前设置拍出来的图片尺寸为3200*2400px。有人说,那就返回呗,大不了耗1-2M的内存,不错,这个尺寸的图片确实只有1.8M左右的大小。但是你想不到的是,这个尺寸对应的Bitmap会耗光你应用程序的所有内存。Android出于安全性考虑,只会给你一个寒碜的缩略图。

    在Android2.3中,默认的Bitmap为32位,类型是ARGB_8888,也就意味着一个像素点占用4个字节的内存。我们来做一个简单的计算题:3200*2400*4 bytes =   30M。

    如此惊人的数字!哪怕你愿意为一张生命周期超不过10s的位图愿意耗费这么巨大的内存,Android也不会答应的。

1 Mobile devices typically have constrained system resources.
2 Android devices can have as little as 16MB of memory available to a single application.

    这是Android Doc的原文,虽然不同手机系统的厂商可能围绕16M这个数字有微微的上调,但是这30M,一般的手机还真挥霍不起。也只有小米这种牛机,内存堪比个人PC,本着土财主般挥金如土的霸气才能做到。

    OK,说了这么多,无非是吐吐苦水,爆爆个人经历而已,实际的解决方案在哪里呢?

    我也是Google到的,话说一般百度不了的问题,那就Google或者直接StackOverFlow,只不过得看英文罢了。

    最后翻来覆去,我在国外的一个Android团队的博客中找到了相应的方案,印证了我的猜想同时也给出了实际的代码。

    我将这篇文章翻译成了中文,作为本博客的基础,建议详细看看。

【译】如何使用Android MediaStore裁剪大图片

    这篇博客了不起的地方在于解决了Android对返回图片的大小限制,并且详细解释了裁剪图片的Intent附加数据的具体含义。OK,我只是站在巨人的肩膀上,改善方案,适应更广泛需求而已。

    拿图说事儿:

    Intent("com.android.camera.action.CROP")对应的所有可选数据都一目了然。在了解上面个个选项的含义之后,我们将目光着眼于三个极为重要的选项:

    dataMediaStore.EXTRA_OUTPUT以及return-data

    data和MediaStore.EXTRA_OUTPUT都是可选的传入数据选项,你可以选择设置data为Bitmap,或者将相应的数据与URI关联起来,你也可以选择是否返回数据(return-data: true)。

    为什么还有不用返回数据的选项?如果对URI足够了解的话,应该知道URI与File相似,你所有的操作如裁剪将数据都保存在了URI中,你已经持有了相应的URI,也就无需多此一举,再返回Bitmap了。

    前面已经说到,可以设置data为Bitmap,但是这种操作的限制在于,你的Bitmap不能太大。因此,我们前进的思路似乎明确了:截大图用URI,小图用Bitmap。

    我将这个思路整理成一张图片:

    这篇主要让大家了解需求的来源,以及如何去思考分析并解决问题。下一篇博客将介绍具体的操作。

 

 

基础篇:

【译】如何使用Android MediaStore裁剪大图片

上篇:

 

Android大图片裁剪终极解决方案(上:原理分析)

中篇:

 

Android大图片裁剪终极解决方案(中:从相册截图)

下篇:

 

Android大图片裁剪终极解决方案(下:拍照截图)

分享到:
评论

相关推荐

    Android裁剪图片终极解决方案

    综上所述,实现Android大图片裁剪的终极解决方案需要综合运用Android的图片处理机制、手势识别、自定义视图以及性能优化策略。通过学习和实践,我们可以构建一个高效且用户体验良好的裁剪工具。提供的`CropImage-...

    Android图片裁剪----移动、缩放图片进行裁剪

    在Android开发中,图片裁剪是一项常见的功能,广泛应用于各种应用程序,如社交应用中的头像设置、拍照应用的编辑功能等。本知识点将详细介绍如何在Android中实现图片的移动和缩放裁剪。 首先,我们需要了解Android...

    Android 自定义裁剪图片

    在Android开发中,自定义裁剪图片是一种常见的需求,它允许开发者根据应用的特定需求来裁剪用户选择的图片,而不仅仅是使用系统默认的裁剪工具。本篇将深入探讨如何在Android中实现自定义图片裁剪功能。 首先,我们...

    android图片或拍照选取指定区域的 完美解决方案

    综上所述,Android中实现"拍照或选取指定区域的图片"的完美解决方案,主要涉及以下几个步骤:引入`CropImage`库,设置相机和相册权限,启动相机或相册选取图片,调用裁剪接口,以及处理裁剪结果。通过这个方案,...

    提取原生android系统图片裁剪源码

    在Android开发中,图片裁剪是一项常见的功能,用于让用户选择并调整图像的显示部分。"提取原生Android系统图片裁剪源码" 提供了一种直接可使用的裁剪插件代码库,允许开发者轻松集成到自己的应用中。下面将详细解释...

    Android视频裁剪 - 含裁剪View

    本文将深入探讨如何在Android环境中实现在MP4视频文件上的裁剪操作,以及如何自定义裁剪视图(Crop View)。 一、MP4视频裁剪原理 MP4视频裁剪涉及到对视频帧的处理。在Android中,可以使用MediaMetadataRetriever...

    android 图片裁剪 非系统

    在Android开发中,图片裁剪是一项常见的需求,例如在用户上传头像或者选择照片时,可能需要进行定制化的裁剪操作。"android 图片裁剪 非系统"的实现意味着开发者需要自定义图片裁剪功能,而不是依赖系统的裁剪应用。...

    利用编译过的libjpeg库实现Android图片压缩的终极方案

    在Android开发中,图片压缩是一项常见的任务,尤其是在处理大量图片或者优化...在实际开发中,结合项目需求,可以进一步扩展和优化这个解决方案,例如添加图片格式转换、图片裁剪等功能,打造一个全面的图像处理工具。

    Android笔记之 图片自由裁剪 DEMO

    在Android应用开发中,图片裁剪是一项常见的需求,比如用户头像设置、照片编辑等场景。本篇将详细探讨如何实现“Android笔记之图片自由裁剪DEMO”,并结合提供的`ImageCutDemo`来深入理解相关知识点。 1. **Intent...

    Android选择图片并裁剪(支持5.0)

    在Android应用开发中,选择图片并进行裁剪是一项常见的需求,尤其对于社交应用或涉及到用户头像设置的应用来说。这个功能允许用户从他们的设备中选取一张照片,然后根据应用的需求进行裁剪,以确保图像符合特定的...

    android实现超高仿微信终极图片选择器

    "android实现超高仿微信终极图片选择器"项目就是一个致力于满足这一需求的开源解决方案。下面我们将深入探讨这个项目的各个关键知识点。 1. **图片选择器的设计** - **多模式选择**:该选择器支持单选和多选两种...

    Android裁剪头像的demo

    "Android裁剪头像的demo"是一个示例项目,它模仿了QQ应用程序的头像裁剪功能,提供了一种高效且用户体验良好的解决方案。这个项目的核心是利用Android的图像处理库和自定义视图来创建一个可交互的裁剪界面。 1. **...

    Android 实现QQ圆形图片裁剪功能

    在Android开发中,有时我们需要实现特定的图片裁剪功能,比如QQ圆形图片裁剪,这在社交应用或者个性化设置中非常常见。QQ圆形图片裁剪功能主要是为了将用户选择的矩形图片转换为圆形,以达到类似QQ头像的效果。下面...

    android安卓图片序列转视频、录屏原理(javacv实现)

    总的来说,利用JavaCV实现Android上的图片序列转视频和录屏功能,不仅涉及到了多媒体处理的技术,还涵盖了用户界面设计和事件处理,以及Android权限管理等多个方面。这个项目对于理解Android多媒体编程和JavaCV库的...

    Android imageUtil 裁剪

    下面我们将详细讨论Android图片裁剪的基本原理和`imageUtil`裁剪工具类的关键知识点。 1. 图片裁剪的基本原理: 在Android中,图片裁剪通常涉及到Bitmap对象的操作。Bitmap是Android系统用来存储图像数据的类,...

    android裁剪和人脸识别示例

    在Android开发中,图片裁剪和人脸识别是两个重要的功能,广泛应用于各种应用程序,如社交网络、照片编辑器等。这个示例项目是从Android 2.3.3(API级别10)的Gallery3D源码中提取出的,旨在帮助开发者理解和实现这两...

    android webview 图片上传 4.4解决方案 防js注入webview

    Android Webview upload 图片上传 ! 导读: Android HTML 打开相册上传照片 ...解决 android webview 在4.4系统上无法使用情况 博客地址 : http://blog.csdn.net/aaawqqq/article/details/51087805

    Android裁剪图片为圆形图片Demo

    在Android开发中,有时我们需要将普通的矩形图片裁剪成圆形,以适应各种设计需求,例如用户头像、应用图标等。本Demo主要探讨如何在Android中实现这一功能,涉及的知识点包括图片处理、自定义View以及绘图API的使用...

    android 把图片切成正方形

    在Android开发中,有时我们需要对图片进行处理,例如将不同尺寸的图片转化为统一的正方形格式,以便在应用中保持视觉一致性或者适应特定布局的需求。本文将深入探讨如何在Android平台上实现这一功能。 首先,我们...

    Android录制编辑播放视频解决方案。

    综上所述,这个解决方案利用了Android的NDK和一系列开源框架,构建了一个功能完善的视频处理系统,涵盖了从录制到播放的全部流程,同时也考虑到了性能和用户体验。开发者可以根据具体需求,灵活选择和定制各个组件,...

Global site tag (gtag.js) - Google Analytics