2

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

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) 原来的= 没有比例的图像 (metrics.densityDpi = 240);

2) 来自可绘制资源= 上面相同的 .png,但在 res/drawable 中编译;

3) 从低档= 缩小比例的图像(metrics.densityDpi = 120);

我也试过了options.inDither = false;,但我看不出有什么区别。

那么我的代码有什么问题?

4

2 回答 2

0

还有一些其他的事情我会尝试:

  1. 加载不带比例的 png,当您绘制图像(从 ImageView 中或直接到画布上)时,设置一个矩阵来缩放图像

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

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

    Bitmap.createScaledBitmap ( original_bitmap, 100, 100, true);
    
于 2012-07-18T14:05:11.230 回答
0

简而言之,最佳质量缩减算法包括 2 个步骤:

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

以下是 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/

于 2014-04-21T01:42:00.687 回答