BitmapFactory.decodeFile("path to a JPEG file") 将JPEG图像解码为内存中的位图时是否解压?
是的。
当我对解码后的 JPEG 文件生成的位图使用 Bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream) 时,压缩图像的大小大于原始图像的大小
这是很有可能的。质量等级为 100,我认为它是可能的,尽管可能不确定。
谁能准确解释这种现象?
对于 JPEG,它们不要求相同。事实上,如果他们是相同,这几乎是随机的机会。
假设我们从内存中的图像开始(Boriginal,其中 B 是位图的缩写)。然后我们将该图像压缩为 JPEG(Joriginal)。 JPEG 采用有损压缩算法,通过考虑到人眼无法辨别微小变化这一事实,对真实世界的图像(例如照片)实现更好的压缩。
假设我们然后将 Joriginal 解码回内存中的位图(Breloaded)。 Breloaded不会是与 Boriginal 相同的图像,因为 JPEG 压缩会改变图像。 Breloaded 与 Boriginal 的接近程度取决于多种因素,部分与图像本身有关,部分与保存 JPEG 时使用的质量级别有关( 100 在您的代码中)。此质量级别的范围为 0 到 100,其中 100 表示最高质量。
如果我们随后将 Breloaded 压缩为第二个 JPEG(Jreloaded),则新的 JPEG 将与原始 JPEG 不同 JPEG(J原始)。部分原因是根据上一段,源位图发生了变化。部分原因是我们可能不会选择与原始压缩工作相同的质量级别。
在您的情况下,您没有创建 Joriginal。您不一定知道所使用的质量级别(该信息可能存储在 JPEG 标头中;我忘记了)。但是因为 Breloaded 将不同于原始位图(无论它来自哪里),当您将位图压缩为 Jreloaded 时,它将不同于 J原创。总的来说,到底是大是小,很难抽象地说。但是,由于您选择的质量级别为 100,并且 Joriginal 很可能已以较低的质量级别进行压缩,因此您的压缩图像很容易变得更大。
这与安卓无关。这纯粹是 JPEG 工作方式的一个函数。如果您对 JPEG 本身还有其他问题,不妨read more about JPEG 并在某些与图像格式有关的网站上提问。