安卓图片反复压缩后为什么普遍会变绿而不是其它颜色?

作者:franksight 时间:2023-04-20 03:08:26 

业余版概要:

安卓的一个核心的部分的代码,为了优化执行速度进行了魔改,结果写错了代码。结果导致 JPG 图片压缩发绿、崩坏。与安卓上的应用无关,它们是受害者

专业版概要:

问题出在 Android 提供的压缩图片接口上,准确的说是一个 Android 里一个叫做 Skia 的库上。而这个 bug 在 2016 年 4 月中旬被修复了,如果按照 Android 的发行来看,那就是从 Android 7 (Nougat) 开始才消除这个问题。

问题出在 RGB 色彩空间转换到 YUV 的时候。但问题不仅仅是精度下降,最大的问题是,错误的舍入(向下取整)。

安卓图片反复压缩后为什么普遍会变绿而不是其它颜色?

现在就要说到 Android 系统到底为什么出了这个问题了。Android 系统自起诞生以来就引入了名为 Skia 的图像库(Google 自家产品),用于处理图像,其中包括把图片压缩成 JPEG(平时说的 JPG)。而 Skia 又是调用libjpeg-turbo 来实现真正的压缩过程的。为了达到更好的压缩效果,JPEG 算法本身,将通常屏幕上表示颜色的 RGB(红绿蓝)数值,转换为 YUV 数值(亮度,蓝色分量,红色分量)。正常情况下这个算法是轻微有损的。

但是 Skia 不走寻常路,在将这个变换算法的各个常数复制到自己的代码里的时候(当然是合法地),降低了精度,以达到更高的速度(专业准确地说,从 16 位定点数,降低到了 8 位定点数),这导致了更大的损伤。

最可怕的是……在进行这个变换运算的最后一步,需要除以 256,而代码中,采用了右移操作代替除法以提高执行速度。

假如我们是 Skia 开发者,如何修复这个问题?

交回给 libjpeg-turbo 库自己来做色彩空间变换,把原本 Skia 库 YUV 转换代码全部删掉了,把这个过程留给整个过程最底层的 libjpeg-turbo库自己来做,并且用默认的 JDCT_ISLOW 方法代替JDCT_IFAST 方法。

来源:https://blog.csdn.net/whj9073/article/details/77528360

标签:android,图片,压缩,变绿
0
投稿

猜你喜欢

  • android为ListView每个Item上面的按钮添加事件

    2023-12-19 06:06:47
  • Android开启新线程实现电子广告牌项目

    2023-02-10 20:47:10
  • Android本地存储SharedPreferences详解

    2023-06-24 17:01:51
  • 通过Session案例分析一次性验证码登录

    2023-04-27 06:25:51
  • Java 数据结构与算法系列精讲之KMP算法

    2023-05-06 14:55:55
  • C#实现日期格式转换的公共方法类实例

    2023-05-16 10:06:54
  • Seata 环境搭建部署过程

    2021-09-06 08:45:36
  • 基于Mybatis映射的一点心得(分享)

    2023-08-08 13:15:53
  • java 算法之希尔排序详解及实现代码

    2022-07-12 23:09:45
  • Spring Boot中使用JDBC Templet的方法教程

    2021-09-06 06:04:38
  • Java 1.0和Java 1.1 的IO类的比较

    2023-10-07 10:48:39
  • C语言安全编码之数组索引位的合法范围

    2021-12-08 06:09:51
  • C#使用XML序列化操作菜单的方法

    2022-08-03 08:54:34
  • IDEA基于支付宝小程序搭建springboot项目的详细步骤

    2021-10-30 22:44:46
  • C#实现异步的常用方式总结

    2023-10-26 17:25:13
  • Java中的main函数的详细介绍

    2021-10-03 16:09:16
  • 解决Maven本地仓库明明有对应的jar包但还是报找不到的问题

    2022-07-21 23:12:07
  • c#实现简单控制台udp异步通信程序示例

    2022-06-13 18:54:38
  • SpringBoot上传文件并配置本地资源映射来访问文件的实例代码

    2023-07-24 02:41:08
  • Spring Boot 实现图片上传并回显功能

    2021-10-11 17:45:20
  • asp之家 软件编程 m.aspxhome.com