私の 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 で作成した非圧縮のビットマップでも、元のバイト [] よりもはるかに大きなサイズになるため、品質が低下する恐れがあります。
私の問題を解決する方法はありますか? よろしくお願いします、ゲルハルト。