设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间08 现在时间08 缓存数据 生活如海,宽容作舟,泛舟于海,方知海之宽阔;生活如歌,宽容是曲,和曲而歌,方知生活甜美。早安

生活如海,宽容作舟,泛舟于海,方知海之宽阔;生活如歌,宽容是曲,和曲而歌,方知生活甜美。早安

查看: 599|回复: 0

Android中图片压缩的三种实现方法

[复制链接]

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
34
主题
26
精华
0
金钱
96
积分
60
注册时间
2023-9-30
最后登录
2025-5-31

发表于 2025-5-31 06:46:54 | 显示全部楼层 |阅读模式
在 Android 开发中,图片压缩是一个重要的优化手段,旨在提升用户体验、减少网络传输量以及降低存储空间占用。以下是几种主流的图片压缩方法,结合原理、使用场景和优缺点进行详细解析。

一、质量压缩法

使用场景
开发者需要在保持图片质量的同时减小文件大小的场景。
是什么
质量压缩法通过降低图片的压缩质量(如 JPEG 的压缩率)来减小文件大小。这种方法不会改变图片的分辨率(宽高不变),但会减少图片的文件体积。
为什么选择它

  • 适用于需要保持较高图片质量但减少文件大小的场景。
  • 常用于社交媒体应用中的图片上传,确保图片快速加载同时保持较好的视觉效果。
何时使用

  • 当需要在保持图片质量的同时减少文件大小时。
  • 适用于网络传输或存储优化场景。



如何实现

通过设置
  1. Bitmap.CompressFormat
复制代码
和压缩质量参数来实现。
代码示例:
  1. //传入的参数为bitmap

  2. private Bitmap compressImage(Bitmap image) {
  3.     ByteArrayOutputStream baos = new ByteArrayOutputStream();
  4.     // 第一次压缩,质量为 100(不压缩)
  5.     image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
  6.     int options = 100;
  7.     // 循环压缩直到满足条件
  8.     while (baos.toByteArray().length / 1024 > 100) {
  9.         baos.reset();
  10.         image.compress(Bitmap.CompressFormat.JPEG, options, baos);
  11.         options -= 10;
  12.     }
  13.     // 生成压缩后的 Bitmap
  14.     ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());
  15.     return BitmapFactory.decodeStream(isBm);
  16. }
复制代码
注意:质量压缩需要按照个人需求去进行调整,示例写了100,没有进行压缩,大家可以尝试一下压缩到50,然后跟原图进行一个对比。



优缺点总结


  • 优点:

    • 实现简单,代码量少。
    • 可以灵活控制压缩质量,适合对图片质量要求较高的场景。

  • 缺点:

    • 在内存中占用的大小不变(分辨率未变),可能导致内存消耗较大。
    • 高质量压缩可能导致图片模糊。


二、采样率压缩法

使用者
开发者需要大幅减小图片尺寸的场景,例如生成缩略图或适应不同屏幕分辨率。
是什么
采样率压缩法通过减少图片的分辨率(降低像素数量)来减小文件大小。通过设置
  1. BitmapFactory.Options.inSampleSize
复制代码
,可以控制图片的缩放比例。
为什么选择它

  • 能有效减少内存占用和文件大小。
  • 适用于需要生成缩略图或适应不同设备屏幕分辨率的场景。
何时使用

  • 当需要大幅减小图片尺寸时。
  • 适用于在内存资源有限的设备上加载大图片。
如何实现

通过设置
  1. inSampleSize
复制代码
来实现采样率压缩。
代码示例:
  1. //传入的参数为图片的路径

  2. private Bitmap getimage(String srcPath) {
  3.     BitmapFactory.Options newOpts = new BitmapFactory.Options();
  4.     // 仅读取图片的宽高,不加载图片到内存
  5.     newOpts.inJustDecodeBounds = true;
  6.     BitmapFactory.decodeFile(srcPath, newOpts);
  7.     newOpts.inJustDecodeBounds = false;
  8.     // 根据需求计算采样率
  9.     int w = newOpts.outWidth;
  10.     int h = newOpts.outHeight;
  11.     float hh = 1280f; // 目标高度
  12.     float ww = 720f; // 目标宽度
  13.     int be = 1;
  14.     // 根据宽度或高度计算采样率
  15.     if (w > h && w > ww) {
  16.         be = (int) (w / ww);
  17.     } else if (h > w && h > hh) {
  18.         be = (int) (h / hh);
  19.     }
  20.     newOpts.inSampleSize = be;
  21.     // 重新加载图片
  22.     return BitmapFactory.decodeFile(srcPath, newOpts);
  23. }
复制代码
优缺点总结


  • 优点:

    • 能显著减少内存占用和文件大小。
    • 支持灵活的缩放比例设置。

  • 缺点:

    • 可能导致图片模糊(尤其是高分辨率图片)。
    • 需要手动计算采样率,增加了开发复杂度。


三、缩放法

使用者
开发者需要精确控制图片尺寸的场景,例如生成特定比例的缩略图。
是什么
缩放法通过调整图片的尺寸(缩放宽高)来减小文件大小。通过
  1. Bitmap.createBitmap()
复制代码
  1. Canvas
复制代码
绘制缩放后的图片,可以实现尺寸压缩。
为什么选择它

  • 适用于需要精确控制图片尺寸的场景。
  • 能够生成符合特定比例的缩略图或适配图片。
何时使用

  • 当需要生成特定尺寸的缩略图或适配不同设备屏幕时。
  • 适用于需要精确控制图片比例的场景。
如何实现

通过创建
  1. Canvas
复制代码
  1. Matrix
复制代码
进行缩放。
代码示例:
  1. //传入的参数为bitmpa,还有需要保存文件的路径


  2. public static void compressBitmapToFile(Bitmap bmp, File file) {
  3.     int ratio = 2; // 缩放比例
  4.     // 创建缩放后的 Bitmap
  5.     Bitmap result = Bitmap.createBitmap(bmp.getWidth() / ratio,
  6.                                        bmp.getHeight() / ratio,
  7.                                        Bitmap.Config.ARGB_8888);
  8.     Canvas canvas = new Canvas(result);
  9.     Rect rect = new Rect(0, 0, bmp.getWidth() / ratio, bmp.getHeight() / ratio);
  10.     canvas.drawBitmap(bmp, null, rect, null);

  11.     // 压缩并保存到文件
  12.     ByteArrayOutputStream baos = new ByteArrayOutputStream();
  13.     result.compress(Bitmap.CompressFormat.JPEG, 100, baos);
  14.     try {
  15.         FileOutputStream fos = new FileOutputStream(file);
  16.         fos.write(baos.toByteArray());
  17.         fos.flush();
  18.         fos.close();
  19.     } catch (Exception e) {
  20.         e.printStackTrace();
  21.     }
  22. }
复制代码
注意:上面的示例方法中,可以直接去掉file的相关逻辑,返回result就可以了
  1. public static Bitmap compressBitmap(Bitmap bmp) {
  2.     int ratio = 2; // 缩放比例
  3.     // 创建缩放后的 Bitmap
  4.     Bitmap result = Bitmap.createBitmap(
  5.         bmp.getWidth() / ratio,
  6.         bmp.getHeight() / ratio,
  7.         Bitmap.Config.ARGB_8888
  8.     );
  9.     Canvas canvas = new Canvas(result);
  10.     Rect rect = new Rect(0, 0, bmp.getWidth() / ratio, bmp.getHeight() / ratio);
  11.     canvas.drawBitmap(bmp, null, rect, null);
  12.     return result; // 直接返回缩放后的 Bitmap
  13. }
复制代码
优缺点总结


  • 优点:

    • 支持精确控制缩放比例。
    • 适用于生成适配不同设备的图片。

  • 缺点:

    • 多次缩放可能导致图片失真。
    • 实现相对复杂,需要更多的代码量。


四、方法优缺点对比总结

方法类型优点缺点质量压缩法- 保持图片质量较高
- 实现简单- 内存占用不变
- 高压缩率可能导致模糊采样率压缩法- 显著减少文件大小和内存占用
- 支持灵活设置采样率- 可能导致图片模糊
- 需要手动计算采样率缩放法- 精确控制图片尺寸
- 适用于生成适配图片或缩略图- 多次缩放可能导致失真
- 实现相对复杂
五、适用场景总结


  • 质量压缩法:适用于需要保持较高图片质量但减少文件大小的场景,例如社交媒体图片上传。
  • 采样率压缩法:适用于需要生成缩略图或适应不同屏幕分辨率的场景,例如在相册应用中加载大图片。
  • 缩放法:适用于需要精确控制图片尺寸的场景,例如生成特定比例的缩略图。
通过以上几种方法的结合使用,可以根据具体需求选择合适的压缩策略,从而优化 Android 应用的性能和用户体验。
以上就是Android中图片压缩的三种实现方法的详细内容,更多关于Android图片压缩的资料请关注晓枫资讯其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表