Android 位图保存后压缩颗粒状图像
我正在通过Glide transformation对图像执行转换,将其设置为黑色背景视图的背景,然后将其保存为PNG。视图如下所示: 将其压缩并保存为PNG后,如下所示: 忽略大小和背景差异,请注意边缘周围的颗粒度。这在保存后将被持久化。PNG的大小与原始图像相同,因此未执行缩放。如何防止这种情况发生?要压缩的代码是: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
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层
使用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第一幅图像是在手机上进行压缩之前位图的屏幕截图。第二个是压缩后保存的图像。重点是显示压缩会在边缘周围造成变色