Android中图片的裁剪与压缩

Android开发必知-图片拍照,选择,裁剪,压缩(适配高版本) ps:这篇文章只是整理偏常规的图片开发知识点。下面走起~ 拍照 在7.0之前,我们设置拍照保存的文件地址的 Uri,都是直接Intent.putExtra(MediaStore.EXTRA_OUTPUT,文件保存的Uri路径),但是 7.0之后,对用户权限提高了保护,之前那种方式行不通了,所以我们要做7.0的判断,用 FileProvider 获取设置保存的文件 Uri,然后放到Intent.putExtra(MediaStore.EXTRA_OUTPUT,文件保存的Uri路径)中,代码如下: 阅读详情


一、图片的剪裁

ImageView默认的ScaleType
讲到图片的剪裁,我们首先要介绍一下ImageView默认的ScaleType设置效果

ImageView的ScaleType一共有8种属性:

matrix
center
centerInside
centerCrop
fitCenter(默认)
fitStart
fitEnd
fitXY

有些文章说默认是matrix,是不正确的,其实默认是FIT_CENTER
可以通过ImageView的源码看到默认设置

private void initImageView() {
    mMatrix = new Matrix();
    mScaleType = ScaleType.FIT_CENTER;

    if (!sCompatDone) {
        final int targetSdkVersion = mContext.getApplicationInfo().targetSdkVersion;
        sCompatAdjustViewBounds = targetSdkVersion <= Build.VERSION_CODES.JELLY_BEAN_MR1;
        sCompatUseCorrectStreamDensity = targetSdkVersion > Build.VERSION_CODES.M;
        sCompatDrawableVisibilityDispatch = targetSdkVersion < Build.VERSION_CODES.N;
        sCompatDone = true;
    }
}

1.属性介绍

(1)matrix
不缩放 ,图片与控件 左上角 对齐,当图片大小超过控件时将被 裁剪
(2)center
不缩放 ,图片与控件 中心点 对齐,当图片大小超过控件时将被 裁剪
(3)centerInside
以完整显示图片为目标, 不剪裁 ,当显示不下的时候将缩放,能够显示的情况下不缩放
(4)centerCrop
以填满整个控件为目标,等比缩放,超过控件时将被 裁剪 ( 宽高都要填满 ,所以只要图片宽高比与控件宽高比不同时,一定会被剪裁)
(5)fitCenter(默认)
自适应控件, 不剪裁 ,在不超过控件的前提下,等比 缩放 到 最大 ,居中显示
(6)fitStart
自适应控件, 不剪裁 ,在不超过控件的前提下,等比 缩放 到 最大 ,靠左(上)显示
(7)fitEnd
自适应控件, 不剪裁 ,在不超过控件的前提下,等比 缩放 到 最大 ,靠右(下)显示
(8)fitXY
以填满整个控件为目标, 不按比例 拉伸或缩放(可能会变形), 不剪裁


二、图片压缩

这里会讲一下图片显示相关的基础知识,如果不关心的可以直接跳到第二点,不过建议是最好看一下

1.图片质量分类

安卓图片显示的质量配置主要分为四种:

ARGB_8888 :32位图,带透明度,每个像素占4个字节
ARGB_4444 :16位图,带透明度,每个像素占2个字节
RGB_565 :16位图,不带透明度,每个像素占2个字节
ALPHA_8 :32位图,只有透明度,不带颜色,每个像素占4个字节
(A代表透明度,RGB代表红绿蓝:即颜色)

2.图片默认质量

Picasso的默认质量是 ARGB_8888
Glide的默认质量则为 RGB_565

3.占用内存

加载一张4000 * 2000(一般手机拍摄的都超过这个像素)的图片

Picasso需要占用的内存为: 32MB

4000 * 2000 * 4 / 1024 / 1024 = 30 (MB)

Glide需要占用的内存为: 16MB

4000 * 2000 * 2 / 1024 / 1024 = 15 (MB)

也就是说只要同时加载几张图片,你的应用就会OOM(内存溢出了),最恐怖的是就算你的ImageView的宽高只有10px,同样会占用那么多内存,这就是为什么需要做图片压缩的原因了

4.图片的尺寸压缩或者拉伸

通过调用override,就可以把图片压缩到相应的尺寸来显示了,类似这些被处理过的图片,就是之前文章中提到的RESULT(处理图)

Glide.with(this).load(mUrl).override(300,300).into(mIv)

三、Bitmap压缩

1.质量压缩

用到的方法是Bitmap 的compress()方法

在保持像素的前提下改变图片的位深及透明度等,来达到压缩图片的目的:

1、bitmap图片的大小不会改变

2、bytes.length是随着quality变小而变小的

2.采样率压缩

int inSampleSize = getScaling(bitmap); 
bitmap = samplingRateCompression(path,inSampleSize);

设置inSampleSize的值(int类型)后,假如设为n,则宽和高都为原来的1/n,宽高都减少,内存降低

3.缩放法压缩

Android中使用Matrix对图像进行缩放、旋转、平移、斜切等变换的

例如:

private Bitmap ScalingCompression(Bitmap bitmap) {
    Matrix matrix = new Matrix();
    matrix.setScale(0.25f, 0.25f);//缩放效果类似于方法2
    Bitmap bm = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
        bitmap.getHeight(), matrix, true);
    Log.i("wechat", "压缩后图片的大小" + (bm.getByteCount() / 1024 / 1024)
        + "M宽度为" + bm.getWidth() + "高度为" + bm.getHeight());
    return bm;
}

Android开发经典案例:实现图片裁剪功能 本文介绍了如何在Android中实现图片裁剪功能,并提供了相应的源代码。通过这些代码,您可以轻松地在自己的Android应用中实现图片裁剪功能,满足不同场景的需求。通过上述代码,我们可以选择一张图片进行裁剪,并将裁剪后的图片显示在ImageView中。在Android开发中,图片处理是一个常见的需求。本文将介绍如何使用Android提供的相关API实现图片裁剪,并提供相应的源代码。在对应的Activity中,我们通过选取一张图片并显示在ImageView中。的隐式调用,并设置了相应的裁剪参数。 阅读详情

相关推荐

Android 完美图片裁剪

android 图片裁剪简单小例子,做好多个手机适配,已经运用在项目中,绝无bug,帮助新手增加相关知识,并且可直接移植到项目过程中。 里面也用到了一些其它技术,帮助大家学习

(UI)Android自定义图片裁剪

Android图片裁剪框绘制,可手势控制

AC1992的专栏 1458

Android中Bitmap常见的一些操作:缩放、裁剪、旋转和偏移

Bitmap是Android中处理图片的一个重要的类,下面这篇文章主要给大家介绍了关于Android中Bitmap常见的一些操作:缩放、裁剪、旋转和偏移的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

Android 图片裁剪 (附源码)

Android 图片裁剪前言正文一、创建并配置项目二、权限申请三、获取图片Uri四、图片裁剪尾声 运行效果图 前言   图片裁剪是对图片进行区域选定,然后裁剪选定的区域,形成一个图片,然后再对这个图片进行压缩,最终返回结果图片。 正文   从上面的描述来看貌似是挺简单的是吧,不过实际操作起来就没有那么简单了,下面先来看看简单的实现方式,就是Android自带的裁剪。 一、创建并配置项目 我们依然从创建项目开始讲起,这虽然有一些繁琐,但无疑可以让每一个Android开发者看懂。创建一个名为PictureCr

晨曦 9465

Ubuntu断网环境下的系统更新:apt-offline保姆级教程(附常见问题排查)

本文详细介绍了在Ubuntu断网环境下使用apt-offline进行系统更新的完整教程,包括环境准备、签名文件生成、数据传输方案对比及常见问题排查。特别适用于企业级开发环境或安全敏感场景,帮助运维人员高效完成离线系统更新,确保系统安全与稳定。

weixin_29214691的博客 358

AnolisOS网卡驱动源码编译与安装实战指南

本文提供了一份详尽的AnolisOS网卡驱动源码编译与安装实战指南。针对系统自带通用驱动不兼容导致网络无法使用的问题,文章从环境准备、源码获取、编译安装到新旧驱动替换与持久化配置,一步步解析了如何通过源码编译安装官方驱动,解决硬件兼容性问题,并确保驱动在系统重启后自动生效。

weixin_28358083的博客 304

安卓实现图片缩放、压缩、裁剪

安卓实现缩放、压缩、裁剪图片1、缩放2、压缩3、裁剪4、项目中 开始的时候:Bitmap是个什么东西? 后面:真香! 1、缩放 /** * 缩放图片 * @param bitmap * @param newWidth * @param newHeight * @return */ public static Bitmap changBmpSize(Bitmap bitma...

xiaoxiao48的博客 1198

管理信息系统(MIS)设计

一名读者可以借阅多本图书,而一本图书也可以被不同的读者借阅,所以读者与图书之间存在着多对多的借阅关系,读者与图书之间存在着多对多的联系,即m:n的联系。每一种图书属于一种图书类型,而一种图书类型可以包含很多本图书,因此可以得到图书类型与图书之间也存在着一种一对多的联系,即图书类型与图书是1:n的联系。系统应该实现以下功能:图书管理员可以维护图书信息,包括增加新书、修改图书信息、办理图书借阅登记、图书归还登记、过期图书处理、丢失图书处理及读者借阅证件信息的维护等;

m0_69718745的博客 2475

android下的图片裁剪和压缩

private static Intent cut(Uri uri, float output, String path) { L.d("ImageCut", "output=" + output); Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "ima

z1032293052的博客 597

银河飞腾FT6678实战指南:OpenMP多核并行编程优化技巧

本文详细介绍了在银河飞腾FT6678多核处理器上使用OpenMP进行并行编程的实战技巧与优化方法。从基础语法到环境配置,再到性能优化的五大核心技巧,包括循环并行化、并行粒度控制、reduction子句使用等,帮助开发者充分发挥FT6678的8核计算能力。通过实际案例展示如何将图像处理算法从200ms优化到28ms,并深入探讨了任务调度、内存访问优化等进阶主题。

weixin_29234423的博客 285

nRF52840开发环境搭建:从零开始配置Keil与SDK

本文详细介绍了nRF52840开发环境搭建的全过程,包括硬件准备、Keil MDK与nRF5 SDK的安装配置、常见问题解决方案及蓝牙功能开发进阶。特别强调了J-Link调试器的使用和SDK版本匹配的重要性,帮助开发者快速上手nRF52840开发。

weixin_29176179的博客 881

Android 图片裁剪 压缩等处理记录

通过Uri获取到图片地址。

shenggaofei的博客 369

2026年OPPO嵌入式岗位面试题带详细答案

本文总结了OPPO嵌入式岗位面试的核心考点,涵盖硬件驱动、系统启动、Linux内核开发等7大模块共34道典型题目。重点解析了SPI通信协议、中断处理、U-Boot启动流程、Linux驱动开发等关键技术,突出硬件调试与工程实践能力考核。题目设置贴合实际岗位需求,适合校招与社招驱动开发岗位应聘者系统复习,帮助掌握嵌入式开发的核心知识与面试要点。

Open 489

Android JAVA 裁剪、压缩图片

**************************************************************************************************************************************     前一段时间项目进入维护阶段之后,工作也不是很忙,不过没清闲几天,Boss就找我有任务了,让把项目中图片文件夹中的图片

j_Lawrencee的博客 522

c\c++: Identifiers, modifier, qualifier, specifier, decorator; systemtap

文章目录参考英语含义在c、C++ 参考 c++ 标准 https://blog.youkuaiyun.com/tyronne/article/details/44016621 英语含义 modifier word or phrase that modifies (modify 2) another word or phrase 修饰语. qualifier (grammar) word, esp an adjective or adverb, that qualifies another word 修饰词; (尤指)形

mzhan017的博客 2427

【基于 CasADi 的欠驱动无人船实时非线性模型预测控制(NMPC)实现与避碰仿真】MATLAB开源复现

本文提出了一种基于CasADi的欠驱动无人船实时非线性模型预测控制(NMPC)方法,实现了轨迹跟踪与避碰功能。研究采用三自由度USV动力学模型,集成静态与动态障碍物避碰约束,并满足国际海上避碰规则(COLREGS)。通过CasADi+IPOPT数值优化求解,实现了毫秒级实时控制。文章详细介绍了USV建模、NMPC控制器设计、避碰约束建模以及CasADi实现流程,包括核心求解流程和轨迹生成方法。实验结果表明,该方法能有效实现复杂环境下的轨迹跟踪与避碰功能。

vor234的博客 1394

Android-图片的选择,裁剪,压缩,适配高版本

效果展示 效果展示链接 https://v.qq.com/x/page/r0735cdxorz.html 1.图片的选取 拍照 我们之前设置拍照保存的文件地址的 Uri,都是直接Intent.putExtra(MediaStore.EXTRA_OUTPUT,文件保存的Uri路径),但是 7.0之后,对用户权限提高了保护,之前那种方式行不通了,所以我们要做7.0的判断,用 FileProvider ...

Android 开发架构 621

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android图片系列-2.Android App图片压缩、裁剪分析整理

App图片压缩裁剪

读书未遍、未敢妄下雌黄 2096

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android相册和拍照并裁剪图片大小,Android 拍照并对照片进行裁剪和压缩实例详解...

Android 拍照并对照片进行裁剪和压缩实例详解本文主要介绍 Android 调用摄像头拍照并对照片进行裁剪和压缩,文中给出了主要步骤和关键代码。调用摄像头拍照,对拍摄照片进行裁剪,代码如下。/*** 调用摄像头拍照,对拍摄照片进行裁剪*/private void showCameraAction() {// 跳转到系统照相机Intent cameraIntent = new Intent(Me...

weixin_42386819的博客 566

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android拍照压缩裁剪并保存图片

在实际项目开发中,有时会遇到拍照,对照片进行剪切,压缩保存等一些功能,别的不扯,代码上: package com.example.cameratest; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFou

小菜鸟笔记 6140

Android怎么旋转裁剪图片,android选择图片拍照详解(裁剪-旋转-压缩)

最新开发一个选择相机拍照功能,遇到了不少问题,这里记录一下。打开相机一般来说有两种方式,一种是自己初始化相机,调用Camera组件,相对来说这种比较复杂,需要做的工作也比较多,还有一种是调用相机的隐式Intent打开相机,打开相机选择图片这种需求其实调用隐式Intent就可以了,没必要自己初始化camera对象。下面是介绍的是如何打开camera相机;/*** 初始化相机控件*/private v...

weixin_35599418的博客 607

android-sunflower中的图片处理:裁剪、压缩与缓存

你是否曾遇到过应用图片加载缓慢、占用空间过大的问题?在移动应用开发中,高效的图片处理不仅能提升用户体验,还能节省带宽和存储空间。本文将以android-sunflower项目为例,详细解析如何实现图片的裁剪、压缩与缓存,让你的应用图片加载既快又省。 ## 项目概述 android-sunflower是一个展示Android开发最佳实践的园艺应用,它演示了如何将基于View的应用迁移到Jetpa...

gitblog_00895的博客 309
上一篇: gradle脚本中groovy语法讲解
下一篇: Glide中图片处理
浮空over
博客等级 码龄7年 6粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值