0

私の Android アプリは、SD カードから画像ファイルを読み取り、その画像を sqlite データベースの blob に保存します。

現在、私は FileInputStream をバイト配列に変換し、これをブロブに保存しています。BLOB のサイズは 1MB を超えることはできないため、この場合はエラー メッセージを送信して操作をキャンセルします。

        FileInputStream fis = null;
    try {
        fis = new FileInputStream(FilePath);    // FilePath contains a valid path
    } catch (FileNotFoundException e) {
        Toast.makeText(MyActivity.this, "File not found: " + FilePath, Toast.LENGTH_LONG).show();
        return;
    }

    BufferedInputStream bis = new BufferedInputStream(fis, 1070);
    ByteArrayBuffer bab = new ByteArrayBuffer(128);

    int current = 0;
    try {
        while ((current = bis.read()) != -1) bab.append((byte) current);
    } catch (IOException e) {
        Toast.makeText(MyActivity.this, "Error reading Picture: " + FilePath, Toast.LENGTH_LONG).show();
        return;
    }

    byte[] imageBa = bab.toByteArray();

    if (imageBa.length > 1024*1024) 
        showErrorDialog();
    else { 
        saveImageInDatabase(imageBa); // sage image byte[] in BLOB-column so sq-lite database

        // show image in imageView
        imageStream = new ByteArrayInputStream(imageBa);
        Bitmap imageBitmap = BitmapFactory.decodeStream(imageStream);   // uncompressed imageBitmap has a much bigger size than the image-byte[]
        imageView.setImageBitmap(imageBitmap);
    }

解像度(サイズではなく)を下げることで、1MBの制限を取り除き、より大きな画像も保存したいと思います。

BitmapFactory オプションの inSampleSize を使用して画像を圧縮したり、bitmap.compress などを使用してビットマップを byte[] に変換したりできます。ただし、BitmapFactory で作成した非圧縮のビットマップでも、元のバイト [] よりもはるかに大きなサイズになるため、品質が低下する恐れがあります。

私の問題を解決する方法はありますか? よろしくお願いします、ゲルハルト。

4

0 に答える 0