Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 位图保存后压缩颗粒状图像_Android_Bitmap_Android Glide - Fatal编程技术网

Android 位图保存后压缩颗粒状图像

Android 位图保存后压缩颗粒状图像,android,bitmap,android-glide,Android,Bitmap,Android Glide,我正在通过Glide transformation对图像执行转换,将其设置为黑色背景视图的背景,然后将其保存为PNG。视图如下所示: 将其压缩并保存为PNG后,如下所示: 忽略大小和背景差异,请注意边缘周围的颗粒度。这在保存后将被持久化。PNG的大小与原始图像相同,因此未执行缩放。如何防止这种情况发生?要压缩的代码是: File file = new File(context.getFilesDir().getPath() + "/" + String.valueOf(num) + ".pn

我正在通过Glide transformation对图像执行转换,将其设置为黑色背景视图的背景,然后将其保存为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像素,压缩似乎无法处理它。

尝试使用
位图工厂.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);

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

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