非常に大きな画像(9000x9000など)のファイルがあります。
ヒープサイズが原因で、ビットマップをメモリにロードできません。ただし、このビットマップのごく一部を表示する必要があるだけです。たとえば、rect width=100-200およびheight=200-400(サブビットマップのサイズ= 100x200)
このビットマップをファイルから取得するにはどうすればよいですか?
注:100x200の画像の品質を失いたくない
ありがとう
これに対する解決策がある可能性はありますか?
たとえば、BitmapRegionDecoder。
API10以降で動作するはずです...
使用法:
BitmapRegionDecoder.newInstance(...).decodeRegion(...)
RapidDecoderを使用して簡単に実行できます。
実際にファイルサイズが約80MBの9000x9000pngを生成し、200x400サイズの領域が正常に読み込まれました。
import rapid.decoder.BitmapDecoder;
Bitmap bitmap = BitmapDecoder.from("big-image.png")
.region(145, 192, 145 + 200, 192 + 400)
.decode();
imageView.setImageBitmap(bitmap);
Android2.2以降で動作します。
デコードしたいRectを指定できるBitmapFactoryメソッドが使えると思います。
public static Bitmap decodeStream (InputStream is, Rect outPadding, BitmapFactory.Options opts)
このコードを試してください:
public static Bitmap decodeSampledBitmapFromFile(String path, int reqWidth, int reqHeight) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(path, options);
final int height = options.outHeight;
final int width = options.outWidth;
options.inPreferredConfig = Bitmap.Config.RGB_565;
int inSampleSize = 1;
if (height > reqHeight) {
inSampleSize = Math.round((float) height / (float) reqHeight);
}
int expectedWidth = width / inSampleSize;
if (expectedWidth > reqWidth) {
inSampleSize = Math.round((float) width / (float) reqWidth);
}
options.inSampleSize = inSampleSize;
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(path, options);
}
私はあなたができるとは思わない。PCでも、画像全体を読み込まずにそれを行う方法がわかりません。PNGなどのほとんどの画像形式ではピクセルデータが圧縮されているため、実行を開始する前に少なくともIDATチャンクを解凍する必要があります。それ以外のものは基本的に画像全体をデコードします。
あなたの立場で、私はサーバーに私のためにそれをさせようとします。とにかくどこで画像を取得しますか?サーバーからではありませんか?次に、画像の適切な部分を提供するWSリクエストを作成してみてください。画像がサーバーから送信されていない場合でも、サーバーに送信して、必要な画像の一部のみを取得することができます。
このコードを試してください:
private Bitmap decodeFile(File f) {
Bitmap b = null;
try {
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
FileInputStream fis = new FileInputStream(f);
b=Bitmap.createBitmap(BitmapFactory.decodeStream(fis, null, o), 100, 200, 200, 400, null, null);
fis.close();
} catch (IOException e) {
}
return b;
}
よくわかりませんが、これはあなたにいくつかのアイデアを与えるかもしれません