将画布图像保存到SQLite?

时间:2011-03-12 12:10:30

标签: android sqlite canvas

我正在尝试将画布上绘制的图像保存为SQLite数据库为Blob。这是代码的一部分。

        //Bitmap is already initialized/drawn
        ByteBuffer buffer = ByteBuffer.allocate (bmp.getHeight() * bmp.getWidth());
            bmp.copyPixelsToBuffer(buffer); 
            byte[] bdata = buffer.array(); 


        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues cv = new ContentValues();
        cv.put(DBHelper.graphIMG, bdata);
        db.insert(DBHelper.graphTable, null, cv);

Howevere,我得到了一个

  

“java.lang.RuntimeException:Buffer   不足以容纳像素“

此代码出错。我错过了什么?是否有更好/更简单的方法将画布作为图像保存到SQLite数据库中?此外,我不太确定如何检索图像。应该可以使用游标和适配器,对吗?谢谢。

3 个答案:

答案 0 :(得分:3)

使用

ByteBuffer buffer = ByteBuffer.allocate(
    bitmap.getRowBytes() * bitmap.getHeight()
);

确保缓冲区的大小正确。

如果您正在重复使用缓冲区,请务必致电

buffer.clear()

bitmap.copyPixelsToBuffer(buffer)

答案 1 :(得分:0)

您没有为位图分配足够大的缓冲区。请记住,根据压缩和颜色深度,位图每个像素可以有多个字节。

答案 2 :(得分:0)

此代码将从url获取图像并将其转换为其工作的字节数组

byte[] logoImage = getLogoImage(IMAGEURL);

private byte[] getLogoImage(String url){
  try {
         URL imageUrl = new URL(url);
         URLConnection ucon = imageUrl.openConnection();

         InputStream is = ucon.getInputStream();
         BufferedInputStream bis = new BufferedInputStream(is);

         ByteArrayBuffer baf = new ByteArrayBuffer(500);
         int current = 0;
         while ((current = bis.read()) != -1) {
                 baf.append((byte) current);
          }

         return baf.toByteArray();
    } catch (Exception e) {
         Log.d("ImageManager", "Error: " + e.toString());
    }
 return null;
}

将图像保存到db我使用此代码。

public void insertUser(){
SQLiteDatabase db               =   dbHelper.getWritableDatabase();

String delSql                       =   "DELETE FROM ACCOUNTS";
SQLiteStatement delStmt         =   db.compileStatement(delSql);
delStmt.execute();

String sql                      =
"INSERT INTO ACCOUNTS   
(account_id,account_name,account_image)  VALUES(?,?,?)";
SQLiteStatement insertStmt      =   db.compileStatement(sql);
insertStmt.clearBindings();
insertStmt.bindString(1, Integer.toString(this.accId));
insertStmt.bindString(2,this.accName);
insertStmt.bindBlob(3, this.accImage);
insertStmt.executeInsert();
db.close();
}

要检索图像,这是我使用过的代码。

public Account getCurrentAccount() {
SQLiteDatabase db       =   dbHelper.getWritableDatabase();
String sql              =   "SELECT * FROM ACCOUNTS";
Cursor cursor           =   db.rawQuery(sql, new String[] {});

if(cursor.moveToFirst()){
    this.accId             = cursor.getInt(0);
    this.accName           = cursor.getString(1);
    this.accImage          = cursor.getBlob(2);
    }
if (cursor != null && !cursor.isClosed()) {
    cursor.close();
    }
db.close();
if(cursor.getCount() == 0){
    return null;
    } else {
    return this;
    }
}

最后将此图片加载到imageview

logoImage.setImageBitmap(
BitmapFactory.decodeByteArray(   currentAccount.accImage, 
    0,currentAccount.accImage.length));