Android:缩减Bitmap时的质量损失

时间:2012-07-17 23:06:51

标签: android bitmap scale

我从SQLiteDatabase获取图像(.png)并使用此代码将bytearray解码为位图:

Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
options.inDither = true;
options.inScaled = true;
options.inDensity = 240;
options.inTargetDensity = metrics.densityDpi;
Bitmap bmp = BitmapFactory.decodeStream(new ByteArrayInputStream(imageAsBytes), null, options);

如您所见,图像(3)应该像(2),但它不是。

1)Original =没有比例的图像(metrics.densityDpi = 240);

2)From drawable resource =上面的.png相同,但是在res / drawable中编译;

3)From downscale =缩小图像(metrics.densityDpi = 120);

我也试过options.inDither = false;,但我认为没有区别。

我的代码出了什么问题?

2 个答案:

答案 0 :(得分:0)

我会尝试其他一些事情:

  1. 加载png时没有比例,当您来绘制图像时(从ImageView中或直接在画布上)设置Matrix以缩放图像

  2. 或者,以所需的密度加载图像,然后尝试使用Paint对象将Bitmap直接绘制到画布上。实例化Paint后,启用位图过滤(这将提高图像质量)

    setFilterBitmap(true) 
    
  3. 最后,您始终可以加载位图(与密度无关)并使用Bitmap.createScaledBitmap手动调整位图大小,确保将第三个参数设置为true(这启用了位图过滤以提高质量)。下面是缩放位图的示例,其中100是所需的大小:

    Bitmap.createScaledBitmap ( original_bitmap, 100, 100, true);
    

答案 1 :(得分:0)

简而言之,最佳质量降尺度算法包括两个步骤:

  1. 使用 BitmapFactory.Options :: inSampleSize-> BitmapFactory.decodeResource() 缩减,尽可能接近您需要但不低于它的分辨率
  2. 通过使用 Canvas :: drawBitmap()
  3. 缩小一点来获得精确的分辨率

    以下是SonyMobile如何解决此任务的详细说明:http://developer.sonymobile.com/2011/06/27/how-to-scale-images-for-your-android-application/

    以下是SonyMobile scale utils的源代码:http://developer.sonymobile.com/downloads/code-example-module/image-scaling-code-example-for-android/