将byteArray转换为从sqlite检索的位图

时间:2013-07-22 08:04:44

标签: android image bitmap bytearray

我正在尝试在sqlite数据库中保存图像,然后再检索它。我以byte []的形式存储它。 BUt位图尚未形成!

存储图像:( blob类型)

Drawable myDrawable = getResources().getDrawable(arr[i]);
myLogo = ((BitmapDrawable) myDrawable).getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
myLogo.compress(Bitmap.CompressFormat.JPEG, 100, stream);
b = stream.toByteArray();

我的检索代码:

byte[] Image;
Image = c.getBlob(c.getColumnIndex("img_str"));
BitmapFactory.Options options = new BitmapFactory.Options();
decodedByte = BitmapFactory.decodeByteArray(Image, 0,Image.length, options);
arr_img.add(decodedByte);

System.out.println("Image = " + Image);
System.out.println("decodedByte = " + decodedByte);

logcat的:

07-22 07:15:55.482: D/skia(19319): --- SkImageDecoder::Factory returned null
07-22 07:15:55.482: I/System.out(19319): Image = [B@4057ea48
07-22 07:15:55.482: I/System.out(19319): decodedByte = null
07-22 07:15:55.521: D/dalvikvm(19319): GC_EXPLICIT freed 114K, 50% free 2871K/5639K,external 5406K/5783K, paused 43ms
07-22 07:15:55.541: D/skia(19319): --- SkImageDecoder::Factory returned null
07-22 07:15:55.541: I/System.out(19319): Image = [B@40577aa0
07-22 07:15:55.541: I/System.out(19319): decodedByte = null

请帮助,因为我无能为力,为什么这不起作用。感谢

2 个答案:

答案 0 :(得分:1)

您的图片字节非常小。你确定这是整个形象吗?根据您的输出,图像只有22个字节,而且很小。我之所以这么说,是因为API声明:

Returns The decoded bitmap, or null if the image could not be decode.

我认为image没有预期的那么大。

尝试使用此代码再次将图像存储在数据库中,然后尝试再次检索:

Bitmap myLogo = BitmapFactory.decodeResource(getResources(), R.drawable.yourBitmap);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
myLogo.compress(Bitmap.CompressFormat.JPEG, 100, stream);
b = stream.toByteArray();

答案 1 :(得分:0)

实际上问题不在于转换,而是我存储它的方式..

我使用预准备语句来插入值.. bindBlob()完成了工作

String sql = "INSERT INTO demoImage (img_name,img_str) VALUES(?,?)";

    SQLiteStatement insertStmt = dbsqlite.compileStatement(sql);
    insertStmt.clearBindings();
    insertStmt.bindString(1, name);
    insertStmt.bindBlob(2, bal);
    insertStmt.executeInsert();