JPEG是一种压缩格式。
BitmapFactory.decodeFile(" JPEG文件的路径")是否在将JPEG图像解码为内存中的位图时对其进行解压缩?
当我对解码后的JPEG文件生成的位图使用Bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream)
时,压缩图像的大小超过原始图像的大小。任何人都可以准确地解释这种现象吗?
答案 0 :(得分:5)
BitmapFactory.decodeFile(" JPEG文件的路径")在将JPEG图像解码为内存中的位图时会解压缩吗?
是
当我在解码后的JPEG文件中使用Bitmap.compress(Bitmap.CompressFormat.JPEG,100,byteArrayOutputStream)生成的位图时,压缩图像的大小大于原始图像的大小
这很有可能。质量水平为100,我认为可能,但也许不放心。
有人可以准确地解释这种现象吗?
对于JPEG,不要求它们相同。事实上,如果他们 相同的话几乎是随机的。
假设我们从内存中的图像开始(B 原始,其中B是位图的缩写)。然后我们将该图像压缩为JPEG(J 原始)。 JPEG结合了有损压缩算法,通过考虑人眼无法识别少量变化这一事实,实现对真实世界图像(例如照片)的更好压缩。
假设我们然后将J 原始解码回内存中的位图(B reloaded )。 B 重新加载 与B 原始不会是相同的图像,因为JPEG压缩会改变图像。 B 重新载入与B 原始的接近程度取决于多种因素,部分与图像本身有关,部分与保存JPEG时使用的质量水平有关(代码中的100
。此质量等级范围从0到100,其中100表示最高质量。
如果我们然后将B 重新加载压缩到第二个JPEG(J 重新加载),则新的JPEG 将不会与原始相同 JPEG(J 原始)。部分地,这是因为根据前一段,源位图发生了变化。部分原因是因为我们可能不会选择与原始压缩工作相同的质量水平。
在您的情况下,您没有创建J 原始。您不一定知道使用了什么质量等级(可能存储在JPEG标题中的信息;我忘了)。但是因为B 重新加载将与原始位图(无论它来自何处)不同,当您将位图压缩为J 重新加载时,它将与J <不同子>原始子>。总的来说,无论是大还是小,都难以抽象地说。但是,由于您选择的质量级别为100,并且J 原始可能已经使用较低的质量级别进行压缩,因此您的压缩图像可能会更大。
这与Android无关。这纯粹是JPEG工作原理的一个功能。如果您对JPEG本身有其他疑问,您可能希望read more about JPEG并在某些网站上提出与图像格式有关的问题。