安卓图片反复压缩后为什么普遍会变绿而不是其它颜色?
业余版概要:
安卓的一个核心的部分的代码,为了优化执行速度进行了魔改,结果写错了代码。结果导致 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 方法。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。如果你想了解更多相关内容请查看下面相关链接
相关推荐
-
Java实现的上传并压缩图片功能【可等比例压缩或原尺寸压缩】
本文实例讲述了Java实现的上传并压缩图片功能.分享给大家供大家参考,具体如下: 先看效果: 原图:1.33M 处理后:27.4kb 关键代码: package codeGenerate.util; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.Fil
-
移动端图片上传旋转、压缩问题的方法
前言 在手机上通过网页 input 标签拍照上传图片,有一些手机会出现图片旋转了90度d的问题,包括 iPhone 和个别三星手机.这些手机竖着拍的时候才会出现这种问题,横拍出来的照片就正常显示.因此,可以通过获取手机拍照角度来对照片进行旋转,从而解决这个问题. Orientation 这个参数并不是所有图片都有的,不过手机拍出来的图片是带有这个参数的. 旋转角度 参数值 0° 1 顺时针90° 6 逆时针90° 8 180° 3 参数为 1 的时候显示正常,那么在这些横拍显示正常,即 Orie
-
Android小知识之图片的3种压缩方式小结
设置图片格式 Android目前常用的图片格式有png,jpeg和webp, png:无损压缩图片格式,支持Alpha通道,Android切图素材多采用此格式 jpeg:有损压缩图片格式,不支持背景透明,适用于照片等色彩丰富的大图压缩,不适合logo webp:是一种同时提供了有损压缩和无损压缩的图片格式,派生自视频编码格式VP8,从谷歌官网来看,无损webp平均比png小26%,有损的webp平均比jpeg小25%~34%,无损webp支持Alpha通道,有损webp在一定的条件下同样支持,有
-
php高清晰度无损图片压缩功能的实现代码
经常会用到把上传的大图片压缩,特别是体积,在微信等APP应用上,也默认都是有压缩的,那么,怎么样对图片大幅度压缩却仍能保持较高的清晰度呢? 压缩通常是有按比例缩放,和指定宽度压缩的,效果很不错,一个数码相机拍的4M图片,压缩后保持了较高的清晰度和原图宽高值,只有700K. 下面是代码(有两个文件,imgcompress.class.php 类,及compress.php) compress.php <?php require_once 'imgcompress.class.php'; $sour
-
微信小程序中上传图片并进行压缩的实现代码
小程序上传图片要先了解他其中的各个属性值,在https://developers.weixin.qq.com/miniprogram/dev/api/media-picture.html内有详细的介绍 今天在这里主要来讲下如何去上传图片并进行压缩,了解下以下属性值 先来看下页面展示(点击上传图片,从相册中选择,上传完图片后又点了一次上传) 来来来,上代码 wxml代码 <button bindtap='chooseImageTap'>上传图片</button> <button
-
java多线程实现下载图片并压缩
最近在做一个需求:从其他系统的ftp目录下载存储图片url的文件,然后读取文件中的url地址,根据地址下载图片后按天压缩成一个包,平均一个地址文件中包含4000个地址左右,也就是说一个文件扫描后需要下载4000个左右的图片,然后压缩,下面把我的实现方式和优化过程记录下来,如果大家有什么更好的方式可以分享. 使用框架:SpringMVC 定时任务实现:继承org.springframework.scheduling.quartz.QuartzJobBean; ftp环境搭建就不说了,在其他博客记录
-
Android LuBan与Compressor图片压缩方式
1,LuBan压缩问题 https://github.com/Curzibn/Luban 之前选择压缩图片库,在github上找的这个star最多的,使用方法是传入图片数组,在异步线程中回调返回的结果.接下来就出现问题了,压缩的图片质量模糊,虽然可以设置多少KB一下不压缩,在正常手机屏幕压缩没太大问题.但是在平板,同一张图片,压缩就会模糊. Luban.with(this) .load(photos) // 传人要压缩的图片列表 .ignoreBy(100) // 忽略不压缩图片的大小 .
-
PHP实现压缩图片尺寸并转为jpg格式的方法示例
本文实例讲述了PHP实现压缩图片尺寸并转为jpg格式的方法.分享给大家供大家参考,具体如下: <?php function ImageToJPG($srcFile,$dstFile,$towidth,$toheight) { $quality=80; $data = @GetImageSize($srcFile); switch ($data['2']) { case 1: $im = imagecreatefromgif($srcFile); break; case 2: $im = imag
-
微信小程序之批量上传并压缩图片的实例代码
具体内容如下所示: 首先,要在.wxml文件里面创建一个canvas,作用是承载压缩的图片,以供上传的时候获取 这个canvas不能隐藏,否则没效果,可以将其移至屏幕外. <canvas canvas-id='attendCanvasId' class='myCanvas'></canvas> 然后呢,就是.js文件里面的方法了 // 点击加_压缩 takePhoto: function () { var that = this; let imgViewList = that.da
-
php实现等比例压缩图片
本文实例为大家分享了php实现等比例压缩图片的具体代码,供大家参考,具体内容如下 /** * desription 压缩图片 * @param sting $imgsrc 图片路径 * @param string $imgdst 压缩后保存路径 */ public function compressedImage($imgsrc, $imgdst) { list($width, $height, $type) = getimagesize($imgsrc); $new_width = $widt
随机推荐
- CentOS 7 网络配置详解
- Mvc动态注册HttpModule详解
- php 随机数的产生、页面跳转、件读写、文件重命名、switch语句
- codeigniter中实现一次性加载多个view的方法
- javascript之正则表达式基础知识小结
- C++ 遍历二叉树实例详解
- jQuery+css3实现文字跟随鼠标的上下抖动
- VBS教程:函数-Date 函数
- sql学习之CASE WHEN THEN ELSE END的用法
- 举例讲解JavaScript中关于对象操作的相关知识
- JavaScript实现设计模式中的单例模式的一些技巧总结
- 毒霸官方“AV终结者/8749” 木马专杀工具
- 在Android系统中解析XML文件的方法
- php快速url重写 更新版[需php 5.30以上]
- Android中文件的压缩和解压缩实例代码
- Angular4 ElementRef的应用
- pandas全表查询定位某个值所在行列的方法
- 15分钟并行神器gnu parallel入门指南
- python代理工具mitmproxy使用指南
- layer.confirm()右边按钮实现href的例子