【问题标题】:How to keep image quality same in BitmapFactory如何在 BitmapFactory 中保持图像质量相同
【发布时间】:2013-05-20 16:13:22
【问题描述】:

我已将位图图像转换为字符串以保存它:

............
Bitmap photo = extras.getParcelable("data");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
String encodedImage = Base64.encodeToString(b, Base64.DEFAULT);

然后我从字符串中检索位图来设置活动的背景,就像这样:

byte[] temp = Base64.decode(encodedImage, Base64.DEFAULT);
Options options = new BitmapFactory.Options();
options.inScaled = false;
Bitmap bitmap = BitmapFactory.decodeByteArray(temp, 0,
                temp.length, options);
Drawable d = new BitmapDrawable(getResources(), bitmap);
getWindow().setBackgroundDrawable(d);

一切正常,但图像质量大大降低。如何保持图像质量与原始图像相同?我在这里做错了什么降低了质量吗?

【问题讨论】:

  • 如果对您有帮助,请检查答案是否正确,以帮助其他有同样问题的人

标签: android bitmap bitmapfactory


【解决方案1】:

无论您使用何种质量设置,JPEG 都是有损的。如果要保持图像不变,则必须使用无损压缩。例如 Bitmap.CompressFormat.PNG

【讨论】:

    【解决方案2】:

    您在这里需要在图片质量和内存使用量之间进行权衡。看看这一行:

    photo.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    

    photo.compress 显然在第二个参数给定的因素中降低了您的图像分辨率,不幸的是,这是您可以获得的最佳质量,因为在 0 - 100 之间,100 代表您可以获得的最佳质量。现在,您有另一种选择,根据原始图片的大小,您可以只保存图像而不压缩它,但请注意,大多数情况下这不起作用,Jalvik 可能会抛出 OutofMemoryException, 希望这会有所帮助。

    【讨论】:

    • 所以问题在于存储图像,而不是检索?
    • 当然,压缩时会降低图像质量,以便获得更小的 byteArrayOutputStream 并避免内存问题
    • 丹尼尔是对的。一个注释让您更好地理解这一点。 JPEG 是基于频率的压缩,它对边缘不是很友好。你的边缘会被严重损坏。你可以在文本上最好地看到这一点。图像压缩总是在质量和大小之间讨价还价。
    • 我将此位图以字符串格式保存在SharedPreference 中(这是另一个坏习惯,因为SharedPreference 不适合这么大的字符串)。那么我可以将位图存储在sqlite数据库中而不会丢失质量吗?
    • 看看android的媒体商店,是一个很好的解决方案,当然sharedprefs不是一个选项,这是链接:developer.android.com/reference/android/provider/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2020-02-19
    • 2019-12-27
    • 1970-01-01
    相关资源
    最近更新 更多