我试图通过以下方式查看各种压缩质量的结果:
private static Bitmap codec(Bitmap src, Bitmap.CompressFormat format,
int quality) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
src.compress(format, quality, os);
byte[] array = os.toByteArray();
return BitmapFactory.decodeByteArray(array, 0, array.length);
}
我有一个名为bitmap
的位图,我将其与压缩版本进行比较:
Bitmap compressed = codec(bitmap,Bitmap.CompressFormat.JPEG ,10);
Log.d("result","bitmap=" + bitmap.getByteCount() + " compressed=" + compressed.getByteCount());
无论我选择加载到bitmap
中的哪张照片,压缩版本的字节数仍然与位图的字节数相同 - 但是,如果我将compressed
加载到一个ImageView
,质量明显降低。
在降低图像的视觉质量的同时,尺寸是否真的保持不变?我是否错误地获取了文件的大小?
编辑:
更奇怪的是,对于在图库详细信息中显示16343040
的图片,结果大小显示1.04mb
个字节。
我使用以下内容获取原始bitmap
到onActivityResult
:
InputStream is = getContentResolver().openInputStream(selectedImageUri);
bitmap = BitmapFactory.decodeStream(is);
is.close();
selectedImageUri
来自getData()
或从设备存储中选择的文件。
答案 0 :(得分:1)
通过Bitmap
getByteCount()
,getAllocationByteCount()
返回可用于表示图像中像素的最小字节数,即最大压缩大小,即使是未压缩的图片!您应该使用Bitmap
,因为它返回<bean id="b" scope="prototype" class="example.component.B"/>
<bean id="c" class="example.component.C"/>
实际使用的字节数。
答案 1 :(得分:1)
Bitmap是一种显示图像的内存数据结构。您的byte[] array
会将大小告知磁盘:array.length
。
(完全清楚。)内存中的位图可能不会使用更多或更少的内存。 (正好在使用其他颜色模型时,如256种索引颜色。)
答案 2 :(得分:1)
BitmapFactory.decodeByteArray 将压缩图像转换为未压缩图像(RGBA8格式)。所以,基本上,你的 codec()函数接收RGBA8图像,压缩它,然后在返回结果之前将其解压缩回RGBA8。
在Smaller PNG Files中讨论过这个问题; Android不直接使用压缩图像 ;所有图像数据都必须从压缩格式转换为RGBA8格式,以便渲染系统可以正确使用它们(参见Rendering Performance 101)。
如果你想要一个较小的内存中图像表示,你需要使用不同的像素格式,如RGB656(在Smaller Pixel Formats中讨论)