Android 图片压缩最常用的几种方法

您所在的位置:网站首页 安卓照片大小压缩软件 Android 图片压缩最常用的几种方法

Android 图片压缩最常用的几种方法

2024-02-08 12:29| 来源: 网络整理| 查看: 265

在android开发中图片是非常容易造成OOM异常的,大部分情况下,都需要对图片进行压缩展示,本文主要是记录下在开发中常见的几种图片压缩方法

一、质量压缩

保持像素的前提下改变图片的位深及透明度(即:通过算法抹掉(同化)图片中的一些某点附近 相近的像素)达到降低质量压缩文件的目的。 使用场景:将图片压缩后将图片上传到服务器,或者保存到本地,根据实际需求

/** * 质量压缩 * 设置bitmap options属性,降低图片的质量,像素不会减少 * 第一个参数为需要压缩的bitmap图片对象,第二个参数为压缩后图片保存的位置 * 设置options 属性0-100,来实现压缩(因为png是无损压缩,所以该属性对png是无效的) * * @param bmp * @param file */ public static void qualityCompress(Bitmap bmp, File file) { // 0-100 100为不压缩 int quality = 20; ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 把压缩后的数据存放到baos中 bmp.compress(Bitmap.CompressFormat.JPEG, quality, baos); try { FileOutputStream fos = new FileOutputStream(file); fos.write(baos.toByteArray()); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } } 二、 尺寸压缩

通过减少单位尺寸的像素值,真正意义上的降低像素(通过缩放图片像素来减少图片占用内存大小) 使用场景:缓存缩略图的时候(头像处理)

/** * 尺寸压缩(通过缩放图片像素来减少图片占用内存大小) * * @param bmp * @param file */ public static void sizeCompress(Bitmap bmp, File file) { // 尺寸压缩倍数,值越大,图片尺寸越小 int ratio = 8; // 压缩Bitmap到对应尺寸 Bitmap result = Bitmap.createBitmap(bmp.getWidth() / ratio, bmp.getHeight() / ratio, Config.ARGB_8888); Canvas canvas = new Canvas(result); Rect rect = new Rect(0, 0, bmp.getWidth() / ratio, bmp.getHeight() / ratio); canvas.drawBitmap(bmp, null, rect, null); ByteArrayOutputStream baos = new ByteArrayOutputStream(); // 把压缩后的数据存放到baos中 result.compress(Bitmap.CompressFormat.JPEG, 100, baos); try { FileOutputStream fos = new FileOutputStream(file); fos.write(baos.toByteArray()); fos.flush(); fos.close(); } catch (Exception e) { e.printStackTrace(); } }

三、 采样率压缩 设置图片的采样率,降低图片像素 好处:是不会先将大图片读入内存,大大减少了内存的使用,也不必考虑将大图片读入内存后的释放事宜。 问题:因为采样率是整数,所以不能很好的保证图片的质量。如我们需要的是在2和3采样率之间,用2的话图片就大了一点,但是用3的话图片质量就会有很明显的下降,这样也无法完全满足我的需要。 GitHub上有名的图片压缩算法采用的就是采样率压缩,他的核心算法就是计算这个采样值

private int computeSize() { srcWidth = srcWidth % 2 == 1 ? srcWidth + 1 : srcWidth; srcHeight = srcHeight % 2 == 1 ? srcHeight + 1 : srcHeight; int longSide = Math.max(srcWidth, srcHeight); int shortSide = Math.min(srcWidth, srcHeight); float scale = ((float) shortSide / longSide); if (scale 0.5625) { if (longSide < 1664) { return 1; } else if (longSide < 4990) { return 2; } else if (longSide > 4990 && longSide < 10240) { return 4; } else { return longSide / 1280 == 0 ? 1 : longSide / 1280; } } else if (scale 0.5) { return longSide / 1280 == 0 ? 1 : longSide / 1280; } else { return (int) Math.ceil(longSide / (1280.0 / scale)); } } 四、图片格式

Android目前常用的图片格式有png,jpeg和webp,

png:无损压缩图片格式,支持Alpha通道,Android切图素材多采用此格式

jpeg:有损压缩图片格式,不支持背景透明,适用于照片等色彩丰富的大图压缩,不适合logo

webp:是一种同时提供了有损压缩和无损压缩的图片格式,派生自视频编码格式VP8,从 谷歌官网 来看,无损webp平均比png小26%,有损的webp平均比jpeg小25%~34%,无损webp支持Alpha通道,有损webp在一定的条件下同样支持,有损webp在Android4.0(API 14)之后支持,无损和透明在Android4.3(API18)之后支持

采用webp能够在保持图片清晰度的情况下,可以有效减小图片所占有的磁盘空间大小



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3