2015-11-08 89 views
1

JPEG是一种压缩格式。 将BitmapFactory.decodeFile(“JPEG文件的路径”)解码为内存中的位图时,是否解压JPEG图像? 当我从解码的JPEG文件生成的位图上使用Bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream)时,则压缩图像的大小大于原始图像的大小。任何人都可以解释这种现象吗?解码时,BitmapFactory.decodeFile()文件是否解压JPEG图像?

回答

4

BitmapFactory.decodeFile(“指向JPEG文件的路径”)是否在将JPEG图像解码为内存中的位图时将其解压缩?

是。

当我在从解码后的JPEG文件生成位图使用Bitmap.compress(Bitmap.CompressFormat.JPEG,100,byteArrayOutputStream),则压缩的图像的尺寸比原始图像的尺寸更

这是非常可能的。质量等级为100时,我会考虑它的可能性,虽然也许没有保证。

任何人都可以解释这种现象吗?

没有要求它们对于JPEG是相同的。实际上,如果他们都是一样,它几乎是随机的。

假设我们从内存映像开始(B 原始,其中B是位图的简写)。然后,我们将该图像压缩为JPEG(J 原始)。 JPEG采用有损压缩算法,通过考虑人眼无法辨别少量变化的事实,在实际图像(例如照片)上实现更好的压缩。

假设我们则J 原始回解码成一个内存中的位图(B 重新加载)。 B 重新加载将不会是相同的图像作为B 原来,因为JPEG压缩会改变图像。 B 重新加载是B 原始将取决于各种因素,部分与图像本身有关,部分与保存JPEG(100代码中使用的质量级别)有关。质量等级从0到100,其中100表示​​最高质量。

如果我们然后压缩乙重载到第二JPEG(j 重新加载),新的JPEG 不会是相同作为原始JPEG(j 原始)。部分原因是,这是因为根据前面的段落,源位图发生了变化。部分原因是,这是因为我们可能不会选择与原始压缩工作相同的质量级别。

在你的情况下,你没有创建J 原始。您不一定知道使用了哪种质量等级(信息可能存储在JPEG标头中;我忘记了)。但是因为B 重新加载将不同于原始位图(无论它来自何处),当您将位图压缩为J 重新加载时,它将与原始的J 不同。总体而言,不论是大还是小,都难以抽象地说。但是,由于您选择的质量级别为100,并且J 原始很可能已经以较低的质量级别压缩,所以您的压缩图像很容易变大。

这与Android无关。这纯粹是JPEG如何工作的功能。如果您还有关于JPEG本身的其他问题,您可能希望read more about JPEG,并在某些网站上提出与图像格式有关的问题。