【问题标题】:Bitmap compress grainy image after saving保存后位图压缩颗粒状图像
【发布时间】:2019-03-25 00:49:04
【问题描述】:

我正在通过 Glide 转换对图像执行转换,将其设置为具有黑色背景的视图的背景,然后将其保存为 PNG 设备。视图如下所示:

将其压缩并保存为PNG后,如下所示:

忽略大小和背景差异,注意边缘周围的颗粒感。这在保存后仍然存在。 PNG 与原始图像的大小正确,因此未执行缩放。我该如何防止这种情况发生?要压缩的代码是:

File file = new File(context.getFilesDir().getPath() + "/" + String.valueOf(num) + ".png");
OutputStream os = null;
try {
   os = new FileOutputStream(file);
} catch (FileNotFoundException e) {
   e.printStackTrace();
}
bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);

为位图设置的属性是:

Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
b.setHasAlpha(true);

我尝试过的事情:

  • 使用 WEBP;同样的问题。
  • 保存视图并构建绘图缓存, 然后保存该位图。再次,同样的问题。
  • 无法使用 JPEG,因为我需要 Alpha 层。

似乎对 PNG 的压缩无法处理明亮的颜色。

更新:

使用 RGB_565 而不是 ARGB_8888 会消除颗粒感,但会在外部添加黑色,因为没有 Alpha 层。如果有任何 alpha 像素,似乎压缩无法处理。

【问题讨论】:

  • 您执行什么转换?附加到问题的源图像是 254x266,转换后的图像是 180x180。所以你真的做一些调整大小吗?如果是这样,你到底是怎么做的?调整大小,尤其是不保留纵横比的调整可能是某些伪影的来源。
  • @sergr 模糊变换和边缘检测之一。忽略这些的大小。我以互联网上的这个为例。
  • 与调整大小有关的另一件事:透明像素的 RGB 颜色是什么(即如何将黑色转换为透明)?如果您进行这样的调整大小可能很重要,请参阅adriancourreges.com/blog/2017/05/09/…
  • 我不确定我是否理解你。如果您的示例图像是您的应用程序的真实结果,为什么源的大小和结果的大小不一样?只有两种选择:您调整大小或这些图像不是真实的。那么哪一个是真的呢?
  • @sergr 第一张图片是在手机上压缩之前位图的屏幕截图。第二张是压缩后保存的图片。关键是要表明压缩会在边缘周围产生变色

标签: android bitmap android-glide


【解决方案1】:

尝试使用BitmapFactory.decodeFile

String filePath = context.getFilesDir().getPath() + "/" + String.valueOf(num) + ".png";

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inDither = false;

BitmapFactory.decodeFile(filePath, options);

或者,您可以使用createScaledBitmap 方法,它有一个标志,您可以在其中设置是否应该过滤缩放的图像。该标志提高了位图的质量。

boolean shouldFilter = false;
bitmap.createScaledBitmap(bitmap, desiredWidth, desiredHeight, shouldFilter);

【讨论】:

    猜你喜欢
    • 2015-04-23
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2012-09-28
    • 1970-01-01
    相关资源
    最近更新 更多