来自资源的图像被正确缩放,但来自SQlite的图像blob不是 - Android

时间:2011-08-14 23:22:17

标签: android sqlite bitmap blob scale

我遇到了一个奇怪的问题。我的Android项目中有多个图像,我将其存储为res \ drawable下的.png文件。我能够在运行时轻松提取图像并将它们转换为如下位图:

Drawable d = getResources().getDrawable(R.drawable.imageId);
Bitmap bitmap = ((BitmapDrawable)d).getBitmap();

这非常有效,无论设备具有什么屏幕密度,图像都能正确缩放。我的所有图像都是200像素乘200像素,我的图像布局配置为200 dip x 200 dip。

现在,由于可伸缩性问题,我已将所有图像存储为SQlite数据库中的blob,我在运行时将它们解压缩并转换为这样的位图:

byte[] bb = cursor.getBlob(columnIndex);
Bitmap bitmap = BitmapFactory.decodeByteArray(bb, 0, bb.length);

如果屏幕密度为标准160倾角,则图像显示正常。但是,如果密度更小或更多,则图像不会缩放,并且对于160倾角,保持200像素×200像素。所以基本上,在较小的屏幕(120倾角)上,图像占用的空间比应有的大,在更大的屏幕上(240倾角),它占用的空间比它应该的少。

有没有其他人遇到过这个奇怪的问题?任何解释,解决方法,解决方案将非常感激。

提前多多谢谢!

3 个答案:

答案 0 :(得分:1)

好的,我终于通过使用createScaledBitmap()来实现它。

从blob创建位图后,我计算缩放系数,然后计算新的宽度和高度。然后我在createScaledBitmap()函数中使用它们。这是有效的代码:

public static Bitmap getImageFromBlob(byte[] mBlob) 
{
    byte[] bb = mBlob;
    Bitmap b = BitmapFactory.decodeByteArray(bb, 0, bb.length); 
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    int newWidth = b.getWidth()*metrics.densityDpi)/DisplayMetrics.DENSITY_DEFAULT;
    int newHeight = b.getHeight()*metrics.densityDpi)/DisplayMetrics.DENSITY_DEFAULT;
    return Bitmap.createScaledBitmap(b, newWidth, newHeight,  true);
}

此链接提供了线索: difference between methods to scale a bitmap

答案 1 :(得分:0)

使用decodeByteArray(byte[] data, int offset, int length, BitmapFactory.Options opts)并在opts set inDesity中说出160。

答案 2 :(得分:0)

为我工作,请参阅this。但我不得不说,我认为SQLite做得对,并且android drawable的大小不正确。