保存

时间:2017-05-19 20:55:29

标签: android bitmap android-glide

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

enter image description here

压缩并将其保存为PNG后,它看起来像这样:

enter image description here

忽略尺寸和背景差异,注意边缘周围的颗粒感。这在保存后持续存在。 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;同样的问题。
  • 保存视图并构建图形缓存, 然后保存该位图。同样,同样的问题。
  • 由于我需要alpha图层,因此无法使用JPEG。

似乎PNG的压缩无法处理鲜艳的颜色。

更新

使用RGB_565代替ARGB_8888可消除颗粒感,但会向外部添加黑色,因为没有alpha层。如果有任何alpha像素,压缩似乎无法处理它。

1 个答案:

答案 0 :(得分:0)

尝试使用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);