当前位置: 首页 > 知识库问答 >
问题:

多次压缩位图

仰城
2023-03-14

Android API提供了位图。压缩(格式、质量、输出)保存位图对象的方法。我创建了一个示例应用程序,它将jpeg图像(一些嘈杂的相机照片)加载到位图中,然后将其压缩回同一个文件。然后,再做5次。

显然,我的位图积累了压缩伪影。让我惊讶的是,这些伪影的数量以一种奇怪的方式取决于压缩的质量。当我将质量设置为100(我认为这是最好的质量)时,工件清晰可见。当我将质量降低到90时,工件的可视性明显降低。质量设置为80会给我最好的效果。当质量设置为70及以下时,图像会迅速退化。

当我以100倍的质量压缩位图时,每次压缩得到的文件大小都会线性增加。对于90和80的质量设置,每次通过时生成的文件大小都保持不变。

我已经在Android5设备(HTC One)和Android6设备(摩托罗拉Moto G)上测试了这种行为,并且非常一致。然而,在Android7上,(三星S7)我看不出结果图像有什么不同。

所以,我的问题是,为什么质量=80的压缩比质量=90,尤其是质量=100的压缩效果更好。我真的希望以100质量保存图像几乎是无损的(比如说,它们在GIMP中)

共有2个答案

彭鹭洋
2023-03-14

JPEG是一种有损压缩算法。即使使用100%质量,解码图像也不会与原始图像完全相同。因此,如果您多次对同一图像进行编码和解码,通常会发现伪影。

如果不想有任何损失,请使用PNG算法。

我的回答有点不完整,因为80%的质量不应该比100%好,如果你的情况是这样,我不知道为什么。

使用Photoshop或GIMP编码时,损失是不可观察的,可能是因为他们改进了算法。更好的结果在Android 7比在较低的版本也可能是相同的结果。

吴英武
2023-03-14

如果没有看到例子,很难分辨出来,但我假设你注意到的伪影是高频成分(其特征是亮度的急剧急剧变化只持续一两个像素)。虽然不是强制性的,但许多. jpeg压缩算法将使用特定的量化矩阵,这些矩阵在较低质量的设置下更容易衰减高频分量,从而为您可能认为对图像更“基本”的低频内容腾出空间。

因此,不难想象,在较低质量的设置下,高频成分会被“切除”图像,降低渐变,产生整体“平滑”的外观。而且,不难想象,由于质量高(但不完美),一些高频分量可能会在连续运行中被夸大,甚至放大(由于量化误差)。

换句话说,JPEG宏块由以下8x8基本体的线性组合组成,在较低的质量设置下,靠近右侧和底部的基本体不太可能出现,因此:没有锐边。

(维基媒体的原始图片,见此处)

 类似资料:
  • 我想上传图像到服务器。将我的图像转换为位图,但仍然出错。位图太大,无法上传到纹理中 如果我得到图片使用画廊意味着我得到错误的位图太大,不能上传到纹理 如果我得到图片使用相机意味着得到错误的 造成:java.lang.安全例外:权限拒绝:阅读<-plhd--1/>MediaProvider uri内容://media/外部/图像/媒体从pid=18253,uid=10257需要android.per

  • 我在Android上工作。我需要保存一个没有质量损失的位图。 我使用位图的方法进行了尝试,将质量设置为100。这对我不起作用,位图失去了太多的质量。我已经测试了JPEG和PNG格式。 我已经测试过将位图复制到,然后提取,并使用保存它。在这种情况下,我无法显示用这种方式保存的图像,我只看到一个空白页。 我的问题是,有没有办法在不压缩的情况下将位图保存在SD卡中? 编辑:这里我的代码的一部分 我检测到

  • 我正在尝试使用Python中的和/或包。我正在尝试以csv格式压缩数据库转储,然后将其放入文件。我让它工作与一次压缩与两个包。 其代码如下所示: 我浏览了文档,也查找了有关压缩技术的信息,但似乎没有关于什么是一次性压缩和增量压缩的全面信息。

  • 我的理解是将块大小信息存储在元块头中,只有块的最终未压缩大小,没有关于压缩长度的信息(9.2)。我猜测需要创建一个包装器,以便在多个线程中使用它,或者可能类似于马克·阿德勒的。 在这种情况下,线程原则是否适用于Brotli,就像它们适用于gzip一样,或者在多线程实现中是否有任何可预见的问题需要注意?

  • 本文向大家介绍Android图片压缩(质量压缩和尺寸压缩),包括了Android图片压缩(质量压缩和尺寸压缩)的使用技巧和注意事项,需要的朋友参考一下 在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩);质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可用于生成

  • 我通常使用压缩,使用解压(由于习惯使用gzip)。 我最近得到了一个带有超线程的四核CPU,所以我有8个逻辑核,我注意到许多核在压缩/解压过程中没有使用。 有什么方法可以利用未使用的内核来加快速度吗?