背景
我需要旋转由相机拍摄的图像,使其始终具有正常的方向。
为此,我使用下面的代码(参考这篇文章获取图像方向):
//<= get the angle of the image , and decode the image from the file
final Matrix matrix = new Matrix();
//<= prepare the matrix based on the EXIF data (based on https://gist.github.com/9re/1990019 )
final Bitmap rotatedBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(),matrix,false);
bitmap.recycle();
fileOutputStream = new FileOutputStream(tempFilePath);
rotatedBitmap.compress(CompressFormat.JPEG, 100, fileOutputStream);
rotatedBitmap.recycle();
这里的压缩率(也称为“质量”参数)为100。
问题
代码运行正常,但结果比原始文件要大得多,远远大于原始文件。
原始文件约为600-700 KB,而生成的文件约为3MB...
尽管输入文件和输出文件都是相同格式(JPEG),这种情况仍然存在。
相机设置为“超精细”质量。不确定它的含义,但我认为它与压缩比有关。
我的尝试
我尝试将“filter”参数设置为false或true。两者都导致文件较大。
即使没有旋转本身(只解码和编码),我也会得到更大的文件大小...
只有当我将压缩比率设置为85左右时,我才能得到类似的文件大小,但我想知道与原始文件相比质量受到了什么影响。
问题
为什么会发生这种情况?
有没有办法获得与输入文件完全相同的大小和质量?
使用与原始文件相同的压缩率是否会发生这种情况?是否可能获取原始文件的压缩率?
什么是100%的压缩率?
编辑:我发现此链接讨论了JPEG文件旋转而不失去质量和文件大小,但 Android 上是否有解决方案?
这里另一个链接说这是可能的,但我找不到任何允许旋转JPEG文件而不失去其质量的库。
llj.read(LLJTran.READ_ALL, true);
这一行会抛出异常。我将第二个参数改为false,就可以工作了。输出jpeg的大小与原始大小大致相同。如果处理时间不是问题(2.5MB jpeg需要约10秒至20秒),我推荐使用此方法。我无法使用此库检查Exif数据,所以我从问题中提到的文章中获取方向信息。 - Yeung