Сохранение изображения холста в SQLite? - PullRequest
1 голос
/ 12 марта 2011

Я пытаюсь сохранить изображение, нарисованное на холсте, в SQLite db как 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);

Однако, я получаю

"java.lang.RuntimeException: буфер недостаточно большой для пикселей "

ошибка с этим кодом. Что мне не хватает? Есть ли лучший / более простой способ сохранить холст как изображение в базе данных SQLite? Также я не слишком уверен, как получить изображения обратно. Это должно быть возможно с помощью курсора и адаптера, верно? Спасибо.

Ответы [ 3 ]

3 голосов
/ 07 января 2012

Используйте

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

, чтобы убедиться, что буфер имеет правильный размер.

Если вы повторно используете буфер, обязательно вызовите

buffer.clear()

перед

bitmap.copyPixelsToBuffer(buffer)
0 голосов
/ 11 ноября 2015

Этот код будет извлекать изображение из 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;
    }
}

Наконец, чтобы загрузить это изображение в просмотр изображений

logoImage.setImageBitmap(
BitmapFactory.decodeByteArray(   currentAccount.accImage, 
    0,currentAccount.accImage.length));
0 голосов
/ 12 марта 2011

Вы не выделяете достаточно большой буфер для растрового изображения. Помните, что растровое изображение может иметь более одного байта на пиксель в зависимости от сжатия и глубины цвета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...