我的磁盘上有一个映像文件,我正在调整文件的大小并将其作为新的映像文件保存回磁盘。出于这个问题,我并不是为了将它们显示在屏幕上而将它们带入内存中,只是为了调整它们的大小并重新保存它们。这一切都很好。但是,缩放后的图像上会出现伪像,如下所示:android:在运行时调整图像大小的质量
由于存在这种失真,因此可以保存它们,因为我可以将它们从磁盘上拉出并在计算机上查看它们,但它们仍然存在相同的问题。
在将图像加载到Bitmap对象以将位图解码到内存中时,我正在使用类似于此内存不足问题的代码:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(imageFilePathString, options);
int srcWidth = options.outWidth;
int srcHeight = options.outHeight;
int scale = 1;
while(srcWidth / 2 > desiredWidth){
srcWidth /= 2;
srcHeight /= 2;
scale *= 2;
}
options.inJustDecodeBounds = false;
options.inDither = false;
options.inSampleSize = scale;
Bitmap sampledSrcBitmap = BitmapFactory.decodeFile(imageFilePathString, options);
然后我用以下方法进行实际缩放:
Bitmap scaledBitmap = Bitmap.createScaledBitmap(sampledSrcBitmap, desiredWidth, desiredHeight, false);
最后,使用以下命令将新调整大小的映像保存到磁盘:
FileOutputStream out = new FileOutputStream(newFilePathString);
scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
然后,正如我提到的,如果我从磁盘上拉出文件并进行查看,它上面存在链接的质量问题,看起来很糟糕。如果我跳过createScaledBitmap,而只是将sampledSrcBitmap直接保存回磁盘,就没有问题,似乎只有在大小更改时才会发生。
正如您在代码中所看到的,我已经尝试过将inDither设置为false,如此处http://groups.google.com/group/android-developers/browse_thread/thread/8b1abdbe881f9f71所述,并且如上文第一篇链接文章所述。那什么都没改变。另外,在我链接的第一篇文章中,罗曼·盖伊说:
而不是在绘制时调整大小(这将是非常昂贵的),请尝试在屏幕外的位图上调整大小,并确保位图为32位(ARGB888)。
但是,我不知道如何在整个过程中确保位图保持为32位。
我还阅读了其他几篇文章,例如http://android.nakatome.net/2010/04/bitmap-basics.html,但它们似乎都在解决绘图和显示位图的问题,我只想调整它的大小并将其保存回磁盘,而不会出现此质量问题。
非常感谢
相关分类