我正在尝试将画布上绘制的图像保存为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数据库中?此外,我不太确定如何检索图像。应该可以使用游标和适配器,对吗?谢谢。
答案 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));