【发布时间】: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