Androidで非常に大きな画像を表示するつもりです。
私の最初のソリューション-PDFとして提供する-すべてのハンドヘルドにpdf-viewerがプリインストールされているわけではないため失敗し、私はしませんユーザーにインストールを要求したい。
表示したいpng(width = 3998px height = 2827px)ができました。この画像をダウンロードして、ギャラリーにどのように表示されるかをテストしました。かなり痛かったです。ギャラリーがこの画像を1回だけレンダリングしているようで、ズームインするとテキストがまったく表示されません。
それで、LinearLayoutにネストされたImageViewを単に持つtestActivityを書きました。画像をドローアブルに入れ、ImageViewの画像ソースとして設定します。残念なことに、アプリが「
ERROR/AndroidRuntime(8906): Caused by: Java.lang.OutOfMemoryError: bitmap size exceeds VM budget"
1つの画像がVM's memory
に対して大きすぎるとは思いませんでした。私は少し遊んで、ImageViews
サイズを3998 & 2827px
に設定し、画像をsdCard
に入れ、fileInputStream
を使用して手動で読み取りました。
驚いたことに、画像が表示されるようになりましたが、Nexus Sを横向きにすると同じになりますOutOfMemoryError
従来通り。FileInputStream
を介してビットマップを受信することと、ImageView's
ソースとして設定することの主な違いを指摘できますか。
また、2つの親scrollViews
で快適にスクロールできません
ズームインおよびズームアウトしながらONE large image
を実行できる機能を備えたscroll horizontal and vertical
を一度に表示する簡単なソリューションを探しています。
ここに私が表示したい画像のサンプルがあります
私はそれが古い記事であることを知っていますが、私はこの問題に多くの時間を費やしたので、ここに私の解決策があります。
2000×3000の画像を表示したいのですが、メモリが足りなくなったり、画像が大きすぎて表示できません。
まず、画像の寸法を取得します。
_o = new BitmapFactory.Options();
o.inJustDecodeBounds=true;
pictures = BitmapFactory.decodeStream(new FileInputStream(f), null, o);
_
次に、4つの部分に切り取り、4つのImageViewで表示しました。画像全体を読み込んで4つにカットしようとしましたが(BitmapFactory.create(bitmap,int,int,int,int)
を使用)、再びメモリ不足になりました。
そこで、私はいくつかのBitMapRegionDecoderを使用することにしました。
_for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
ImageView iv = new ImageView(this);
InputStream istream = null;
try {
istream = this.getContentResolver().openInputStream(Uri.fromFile(f));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
BitmapRegionDecoder decoder = null;
try {
decoder = BitmapRegionDecoder.newInstance(istream, false);
} catch (IOException e) {
e.printStackTrace();
}
int nw = (j*width/k);
int nh = (i*height/k);
Bitmap bMap = decoder.decodeRegion(new Rect(nw,nh, (nw+width/k),(nh+height/k)), null);
iv.setImageBitmap(bMap);
}
}
_
これはうまくいきました。
これを使ってみてください: https://github.com/davemorrissey/subsampling-scale-image-view
フォトギャラリー用に設計され、OutOfMemoryErrorsのない巨大な画像(地図や建物の計画など)を表示するAndroidのカスタム画像ビュー。ピンチしてズーム、パン、回転、アニメーションをサポートし、簡単に拡張できるため、独自のオーバーレイやタッチイベント検出を追加できます。
私は古い質問を知っていますが、これを正確に行うためにTileViewを使用しました:
WorldMapアプリケーションのこの「整数化が容易」なソースを使用できます。
https://github.com/johnnylambada/WorldMap
これは世界地図の巨大な画像を使用し、キャッシュを使用して地図を表示します。
整数化するために、私はすべてのJavaファイル(5と思う))をコピーし、レイアウトファイルでsurfaceViewを使用しました。次に、ImageViewerActivity.Javaの小さなOnCreate()メソッドを実行し、私の活動のコード(私の個人的な使用に応じて、スライ変更)。
この投稿 は、マルチタッチジェスチャを使用して画像をズームするための優れたデモです。マトリックスを使用して、画像をズームおよびパンします。
巨大な画像の読み込み中にメモリ不足の例外を削除するには、次の手順に従う必要があります。
1. Read Bitmap Dimensions and Type
2. Load a Scaled down version into memory
Androidデベロッパーガイドでは、これらを実現する方法を定義しています。ここにリンクがあります
http://developer.Android.com/training/displaying-bitmaps/load-bitmap.html#load-bitmap
スケーリングなどを処理し、フル解像度を使用するには、OSMのMapView(オープンストリートマップ)を使用して、タイルを(マップの代わりに)提供できます。これを確認してください: http://www.haakseth.com/?p=