Android大图片裁剪终极解决方案-原理分析【推荐】

Android仿微信图片选择功能开发实战 在现代移动应用开发中,图片选择功能已成为用户交互的核心环节之一。仿微信图片选择功能的实现,不仅提升了用户体验,也增强了App的社交属性。用户希望通过简洁的界面完成图片拍摄、多选、裁剪与上传等操作,这对功能的响应速度、兼容性和交互设计提出了较高要求。在Android平台上实现这一功能,需面对碎片化设备、权限管理复杂、系统版本差异等挑战。选择Android Studio作为开发工具,得益于其强大的Jetpack组件支持、完善的调试体系和良好的第三方库集成能力,为高效实现图片选择流程提供了保障。 阅读详情

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

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

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

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

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

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

intent.putExtra("outputX", outputX);
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也不会答应的。

Mobile devices typically have constrained system resources.
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裁剪大图片 http://www.linuxidc.com/Linux/2012-11/73939.htm

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

拿图说事儿:

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

data、MediaStore.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。

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

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


推荐一篇文章:

一个草根程序员创业之路的所感所悟-2016 


#1机器学习(西瓜书)自学记录 《机器学习 》 Datawhale 组队学习, 吃瓜自学笔记。 阅读详情

相关推荐

PCB之AD层次化原理图设计

PCB之AD层次化(模块化)原理图设计 软件版本:AD17.1.9(bBuild 592) 先上效果图: 可以看到,图中有RS485和W5500这两个部分是复用了原理图,当项目中需要多个功能相同的电路时,这种设计就可以大大节约PCB布局布线的时间,方法后面介绍; 1.首先确定好项目中个部分电路的功能模块 不同功能的电路分开不同原理图画,然后给出输入输出端口,这样方便复用,下面是实例项目的功能划分 2.单个模块电路的接口设计 这里以W5500以太网接口电路为例说明: 主要就分为通讯接口和电源接口:

洋洋洋的博客 3万+

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

转载声明:Ryan的博客文章欢迎您的转载,但在转载的同时,请注明文章的来源出处,不胜感激! :-) http://my.oschina.net/ryanhoo/blog/86842 约几个月前,我正为公司的APP在Android手机上实现拍照截图而烦恼不已。 ...

cibaoqb025084的博客 370

Starlink地面终端天线对星(一)对星流程,星历下载,信标信号

starlink卫星终端对星采用机械伺服+相控阵电子扫描的混合模式,兼顾快速盲扫和高精度跟踪;对星流程分三步:冷启动与盲捕获 → 建立初始链路并下载星历 → 进入正常通信模式;

chen2jiang3的博客 2724

Android开发技巧——大图裁剪

本篇内容是接上篇《Android开发技巧——定制仿微信图片裁剪控件》 的,先简单介绍对上篇所封装的裁剪控件的使用,再详细说明如何使用它进行大图裁剪,包括对旋转图片的裁剪。 裁剪控件的简单使用 XML代码 使用如普通控件一样,首先在布局文件里包含该控件: <com.githang.clipimage.ClipI...

weixin_33758863的博客 420

【银行测试】手机银行APP专项项目+测试点汇总(一)

1、手机银行APP转账项目讲解面试官:请介绍一下你所负责的模块如何进行的测试?求职者:好的,我最近测试的是XX银行的手机银行App项目。这个项目里面包含了转账、转账额度调整、网银转账、交易明细、添加账户、存款、投资理财、生活缴费等功能模块。我主要负责了转账模块,这个大模块中包含了智能转账、手机转账、语音转账、预约转账、收款人管理等5个子模块,我首先介绍一下我们生活中使用最多的手机转账子模块。对于转账需要关注的是转账前、转账中、转账后这三个状态下的测试。

m0_70102063的博客 1604

使用TMS320F28335控制四位共阳数码管

简要阐述利用F28335控制四位共阳数码管的整个过程,包括原理、思路、部分代码以及调试过程。

liujunhaozuishuai的博客 2659

【Android】Bitmap图片裁剪(91/100)

简单的点胜过复杂的高明

产品:SmartApi;服务:大前端++;其他技术分享 3241

Axure RP9 利用中继器实现列表数据的切换,分页器数据的动态交互加载

Axure RP9 利用中继器制作分页组件 在原型制作中,如何实现分页数据的动态加载、分页与数据的交互,每页显示条数的设定。下面通过制作五年级一班成绩单分页列表,分享给大家,适合有一定axure使用基础的人员,如有更好的方案,请多多指教。 最终效果图: 步骤1:首先利用中继器画出成绩单列表,并绑定成绩单数据。 步骤2:画出每页显示条数控制下拉框,利用中继器画出分页组件 步骤3:新增全局标量maxpage(显示的最多页码),minpage(显示的最小页码),i(循环计数),j(最循环数),selectpa

shandongmike的博客 6819

Android 如何在不换资源的前提下裁剪图片尺寸

原生控件图片裁剪

baidu_34395789的博客 669

【GlobalMapper精品教程】006:Excel表格(.xls)或文本(.txt .csv)坐标文件生成矢量点

原始的坐标数据如下图所示,其中坐标为Lat经度,LNG纬度,均为十进制度的形式,一般软件都支持十进制度的格式,如果不支持,你可以尝试使用度分秒的形式,图中的DDMMSS-LAT为纬度,DDMMSS-LNG为经度。打开globalmapper软件,点击【打开数据文件】,选择坐标数据文件(案例中的数据位配套实验数据包中的data006.rar)气象台站分布点坐标.xls。选择坐标系:本案例数据采用的是经纬度,因此选择Geographic(Latitude/Longitude),基准选择WGS84,点击确定。

智慧空间实验室 2570

气象大模型光伏功率预测中的应用:从短期,超短期,中长期的实现与开源代码详解

本文详细介绍了基于大模型的光伏功率预测方法,涵盖超短期(15分钟-1小时)、短期(1-6小时)和中长期(1天-1周)预测。文章首先讨论了数据准备与预处理,包括历史功率、气象、天文和电站特性数据的收集与特征工程。随后,针对不同预测需求,提出了多种深度学习模型:超短期预测采用1DCNN-LSTM混合模型,短期预测使用Transformer模型,中长期预测则通过多尺度特征提取模型和概率预测方法处理不确定性。文章还提供了模型训练、评估、部署和优化的完整流程,并开源了代码实现。未来研究方向包括结合数值天气预报、开发时

专注AI大模型,软件混淆,授权 1575

安卓剪裁图片(直接操作bitmap)

/** * 按正方形剪裁图片 * 指定正方形边长 */ public static Bitmap imageCrop(Bitmap bitmap, int width) { // 得到图片的宽,高 int w = bitmap.getWidth(); int h = bitmap.getHeight();

非典型程序媛 1570

AUTOSAR 3万字面试题全面解析(持续更新)

ECU抽象层(EAL)是AUTOSAR架构中的一部分,它位于微控制器抽象层(MCAL)之下,但通常与MCAL一起被提及。EAL的目标是提供一个统一的接口来访问和管理ECU(Electronic Control Unit,电子控制单元)的硬件资源,包括处理器、存储器和外围设备。通过这种抽象,EAL使得上层软件能够以一种标准化的方式与ECU硬件交互,而不需要关心具体的硬件实现细节。EAL解决了硬件异构性带来的问题,即不同ECU可能采用不同类型的处理器和硬件配置。

大模型大数据攻城狮的专栏 5609

终极指南:Android图片裁剪库让照片编辑变得如此简单!

还在为Android应用中的图片裁剪功能而烦恼吗?🤔 今天我要向你推荐一款强大的Android图片裁剪库——Android Image Cropper,它能让你的照片编辑体验变得前所未有的简单高效! Android Image Cropper是一个专为Android平台优化的图片裁剪解决方案,特别针对相机和图库场景进行了深度优化。无论你是要开发社交应用、照片编辑软件,还是简单的头像上传功能,这

gitblog_00461的博客 851

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android开发:相册读取、拍照、图片裁剪和图片上传服务器等功能的实现

修改日志 2016.05.12 之前的程序存在两个问题: 1)从相册选择的图片如果比较大,会失败; 2)无法拍照上传照片。 修改了这两个bug,之前的代码已经被覆盖掉了,留着太误人子弟了。同时修改了一下标题和文章的文字描述拍照示意 相册示意 一 整体功能描述 二 功能实现 1 获得图片 2上传到服务器并保存 3从服务器中获得图片并显示 4辅助工具 一. 整体功能描述整理了一下主要

生活没有if-else 2万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android vivo美颜相机相册 照亮你的美 图片压缩 图片滤镜,裁剪(附带完整项目源码)

Android 性能优化(十)图片加载和大图片缓存机制OOM完美解决方案LruCache&DiskLruCache https://blog.youkuaiyun.com/WHB20081815/article/details/68493509https://blog.youkuaiyun.com/WHB20081815/article/details/68493509 Android List,Set,Ma...

深南大盗的博客 7541

[Android] 图片裁剪总结——调用系统裁剪

花了两天时间看了下android的图片裁剪功能的实现。其实刚开始做这个我挺虚的,以为整个功能都需要自己写出来,但查了些资料,发现android已经提供了裁剪功能,需要的话自己调用就成了。soga,这下轻松多了。 原文地址请保留http://www.cnblogs.com/rossoneri/p/3976530.html  首先推荐几篇博客 Android大图片裁剪终极解决方案

HarryWeasley的专栏 3587

IOS开发之——图片裁剪(82),已拿offer附真题解析

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长。而不成体系的学习效果低效漫长且无助。时间久了,付出巨大的时间成本和努力,没有看到应有的效果,会气馁是再正常不过的。所以学习一定要找到最适合自己的方式,有一个思路方法,不然不止浪费时间,更可能把未来发展都一起耽误了。如果你是卡在缺少学习资源的瓶颈上,那么刚刚好我能帮到你。以上知识笔记全部免费分享,如有需要获取知识笔记的朋友,可以点击我的GitHub免费领取。如果你是卡在缺少学习资源的瓶颈上,那么刚刚好我能帮到你。

2401_83620690的博客 489

2024年安卓最全Android 仿微信, QQ 裁剪,腾讯 行业应用 面试

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。还有。

2401_84563220的博客 665

从源码读懂 SuperImageView 裁剪原理:Matrix 矩阵变换实现任意方位裁剪的秘密

SuperImageView 是 GitHub 上一个专注于图片裁剪与圆角处理的开源 Android 库,其裁剪功能不依赖 Bitmap 重绘,而是通过 Matrix 矩阵变换实现任意方位裁剪。很多开发者好奇:为什么一个 ImageView 就能做到"想裁哪边裁哪边"?本文将从源码出发,一步步拆解 SuperImageView 裁剪原理,带你读懂 Matrix 缩放、平移与方位映射之间的数学秘密,

gitblog_00222的博客 758

Android圆角图片和圆形图片实现总结

Android研发中经常会遇见圆角或者圆形图片的展示,但是系统中ImageView并不能直接支持,需要我们自己做一些处理,来实现圆角图片或者圆形图片,自己最近对这块的实现做了一下总结.

王三的专栏 2万+

4.14-2 如何使用Android MediaStore裁剪大图片

http://blog.youkuaiyun.com/floodingfire/article/details/8144587   如何使用Android MediaStore裁剪大图片 标签: androidAndroidBitmapcropMediaStore图片裁剪 2012-11-03 21:46 5953人阅读 评论(2) 收藏 举报  分类:  

Kodulf的专栏 719

android 固定比例图片裁剪插件,移动端添加图片裁剪的坑

本文关键:阻止冒泡、canvas压缩、canvas裁剪、生成黑色图片。最近项目需要在添加图片时实现裁剪功能,虽然 github 上开源的裁剪插件不少,试了好几个插件,在移动端体验好的寥寥无几。躺了几个坑,分别说一下。好像是腾讯团队做的一个插件,网上推荐度还挺高的,但是我在上手测试的时候发现,一些问题:不适配 pc 端滚轮缩放。裁剪时无法缩小图片,只能放大。(这也是我放弃它的原因)它依赖 trans...

weixin_42498989的博客 311

WinUtil 完整指南:一次搞定 Windows 软件安装、系统优化与更新管理

WinUtil 是一款由 Chris Titus Tech 开发的开源 Windows 系统管理工具,通过一个图形化界面集中处理日常需要翻遍注册表、控制面板和各类官网才能完成的工作:批量安装软件、系统优化调整、组件与故障修复,以及 Windows 更新策略控制。作者建议每次装完新系统后都运行一次。 [![WinUtil 主标题界面](https://raw.gitcode.com/GitHub_

gitblog_00838的博客 449

推荐项目:TextureVideoView - 视频裁剪神器

推荐项目:TextureVideoView - 视频裁剪神器 在这个数字化的时代,视频已经成为我们日常交流和娱乐的重要组成部分。然而,对于开发者来说,实现视频的播放和裁剪功能可能会是一项挑战。今天,我们要向您推荐一个出色的开源项目——TextureVideoView。它基于Android的TextureView,可以轻松地对视频进行播放和裁剪操作。 项目介绍 TextureVideoView是一个...

gitblog_00044的博客 503

为什么选择android_maskable_layout?5大Android布局遮罩方案终极对比评测

在 Android 开发中,圆形头像、异形卡片、剪影动画这些炫酷效果,几乎都离不开 **Android布局遮罩**(Layout Mask)技术。市面上的实现方案五花八门,新手很容易踩坑。本文以开源库 **android_maskable_layout** 为核心,带来 5 大 Android布局遮罩方案的终极对比评测,用最直观的方式告诉你:哪个方案最省心、哪个支持动画遮罩、哪个性能最稳,帮你一次

gitblog_01182的博客 788
上一篇: 互联网创业的南派与北派
下一篇: 一个草根程序员创业之路的所感所悟-2016
gridlayout
博客等级 码龄19年 12粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值