相关文章推荐

在JAVA安卓系统中,转换blob-->字节数组-->位图会返回空位图

0 人关注

我正在将位图存储到我的sql数据库中,将其转换为字节数组并作为BLOB存储在sql表中。然后,我从表中的字节数组中检索BLOB,然后将其转换为位图,在图像视图中显示。

为此,我首先将位图转换成字节数组,像这样。

Bitmap thumbnail = ThumbnailUtils.extractThumbnail(currentBitmap, 512, 384);
byte[] thumbBytes = getBytesFromBitmap(thumbnail, 10);
myDB.createNewDoc(tempName, currentTable, thumbBytes, dateCreated);

这是我的getBytesFromBitmap()方法。

public byte[] getBytesFromBitmap(Bitmap bitmap, int quality) {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.WEBP, quality, out);
        return out.toByteArray();

这里currentBitmap是我的原始位图。

这是我用来创建表的sql查询,该表将包含一个存储位图的列。

sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS DOCS_DATA (SNO INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT UNIQUE NOT NULL, TABLE_NAME TEXT UNIQUE NOT NULL, THUMBNAIL BLOB, CREATEDON TEXT);");

这里倒数第二列是BLOB类型的THUMBNAIL,包含转换为字节数组的位图。

为了向该表插入数据,我使用了以下查询。

public void createNewDoc(String doc_name, String table_name, byte[] thumbnail, String created_on) {
        sqLiteDatabase.execSQL("INSERT INTO DOCS_DATA (NAME, TABLE_NAME, THUMBNAIL, CREATEDON) VALUES ('" + doc_name + "', '" + table_name + "', '" + thumbnail + "', '" + created_on + "');");

现在,为了从表中检索数据,我使用了以下方法。

public ArrayList<Object> getAllDocs() {
        ArrayList<String> names = new ArrayList<>();
        ArrayList<Integer> imagesNumber = new ArrayList<>();
        ArrayList<Bitmap> thumbnails = new ArrayList<>();
        ArrayList<String> createdon = new ArrayList<>();
        Cursor cur = sqLiteDatabase.rawQuery("SELECT NAME, TABLE_NAME, THUMBNAIL, CREATEDON FROM DOCS_DATA ORDER BY SNO;", null);
        for (int i = 0 ; i < cur.getCount() ; i++) {
            cur.moveToPosition(i);
            names.add(cur.getString(0));
            byte[] img = cur.getBlob(2);
            Log.e("BLOB ---- ", ""+img.toString());
            Log.e("BLOB ---- ", ""+img.length);
            Bitmap bitmap = BitmapFactory.decodeByteArray(img, 0, img.length);
            Log.e("Bitmap", ""+bitmap);
            thumbnails.add(bitmap);
            createdon.add(cur.getString(3));
            Cursor cur1 = sqLiteDatabase.rawQuery("SELECT * FROM " + cur.getString(1) + ";", null);
            imagesNumber.add(cur1.getCount());
            cur1.close();
        cur.close();
        ArrayList<Object> objects = new ArrayList<>();
        objects.add(names);
        objects.add(imagesNumber);
        objects.add(thumbnails);
        objects.add(createdon);
        return objects;

你可以看到,在这最后一部分代码中,我有3个Log.e(...),这就是我通过这3个日志得到的东西。

E/BLOB ----: [B@ef5c8e2
E/BLOB ----: 29753
 
推荐文章