来自资源的图像已正确缩放,但来自 SQlite 的图像 blob 未正确缩放 - Android



我遇到一个奇怪的问题。我在我的Android项目中有多个图像,我将其存储为resdrawable下的。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 dip,图像显示良好。但是,如果密度更小或更大,则图像不会缩放,并且在160 dip时保持200像素x 200像素。所以基本上,在较小的屏幕上(倾角为120度),图像占用的空间比应有的要多,而在较大的屏幕上(倾角为240度),图像占用的空间比应有的要少。

还有人遇到这个奇怪的问题吗?任何解释,变通,解决方案将是非常感激。

提前感谢!

好了,我终于通过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);
}

这个链接提供了线索:缩放位图方法的差异

使用decodeByteArray(byte[] data, int offset, int length, BitmapFactory.Options opts),并在选项中将inDesity设置为160

为我工作,看看这个。但我不得不说,我认为SQLite做得对,android drawable的大小不正确。

最新更新