我遇到了一个奇怪的问题。我的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倾角),它占用的空间比它应该的少。
有没有其他人遇到过这个奇怪的问题?任何解释,解决方法,解决方案将非常感激。
提前多多谢谢!
答案 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);
}
答案 1 :(得分:0)
使用decodeByteArray(byte[] data, int offset, int length, BitmapFactory.Options opts)
并在opts set inDesity
中说出160。
答案 2 :(得分:0)
为我工作,请参阅this。但我不得不说,我认为SQLite做得对,并且android drawable的大小不正确。