BitmapFactory.decodeFile() 文件在解码时是否解压缩 JPEG 图像?

Does BitmapFactory.decodeFile() file decompress the JPEG image when decoding it?

JPEG 是一种压缩格式。 BitmapFactory.decodeFile("path to a JPEG file") 将 JPEG 图像解码为内存中的位图时是否解压缩? 当我对解码的 JPEG 文件生成的位图使用 Bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream) 时,压缩图像的大小大于原始图像的大小。谁能准确解释这个现象?

Does BitmapFactory.decodeFile("path to a JPEG file") decompress the JPEG image when decoding it as a Bitmap in the memory?

是的。

And when I use Bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream) on the resulting bitmap from the decoded JPEG file, then the size of the compressed image is more than the size of the original image

很有可能。质量水平为 100,我认为有可能,但可能不确定。

Can anybody exactly explain this phenomenon?

JPEG 不要求它们相同。事实上,如果它们 相同,那几乎是随机的。

假设我们从一张in-memory图像开始(B原始,其中B是位图的缩写)。然后我们将该图像压缩为 JPEG (Joriginal)。 JPEG 结合了有损压缩算法,通过考虑到人眼无法辨别少量变化这一事实,在 real-world 图像(例如照片)上实现更好的压缩。

假设我们随后将 Joriginal 解码回 in-memory 位图 (Breloaded)。 Breloaded 不会是与 Boriginal 相同的图像,因为 JPEG 压缩会改变图片。 Breloaded 与 Boriginal 的接近程度取决于多种因素,部分与图像本身相关,部分与质量水平相关保存 JPEG 时使用(代码中的 100)。此质量等级范围从 0 到 100,其中 100 表示最高质量。

如果我们然后将 Breloaded 压缩为第二个 JPEG (Jreloaded),新的 JPEG 将不会与原始 JPEG 相同(J原始)。部分原因是,根据上一段,源位图发生了变化。部分原因是我们可能不会选择与原始压缩工作相同的质量级别。

在你的情况下,你没有创建 Joriginal。您不一定知道使用的是什么质量级别(该信息 可能 存储在 JPEG header 中;我忘记了)。但是因为 Breloaded 将不同于原始位图(无论它来自哪里),当您将位图压缩为 Jreloaded 时,它会不同于 Joriginal。总的来说,是大还是小,很难抽象的说。但是,由于您选择的质量级别为 100,并且 Joriginal 很可能已使用较低的质量级别进行压缩,因此您的压缩图像很容易变得更大。

这与Android无关。这完全取决于 JPEG 的工作原理。如果您对 JPEG 本身有进一步的疑问,您可能希望 read more about JPEG 并在一些与图像格式有关的网站上提问。