web-dev-qa-db-ja.com

Android

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を一度に表示する簡単なソリューションを探しています。

ここに私が表示したい画像のサンプルがあります enter image description here

29
Rafael T

私はそれが古い記事であることを知っていますが、私はこの問題に多くの時間を費やしたので、ここに私の解決策があります。

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);

    }
}
_

これはうまくいきました。

29
leadersheep

これを使ってみてください: https://github.com/davemorrissey/subsampling-scale-image-view

フォトギャラリー用に設計され、OutOfMemoryErrorsのない巨大な画像(地図や建物の計画など)を表示するAndroidのカスタム画像ビュー。ピンチしてズーム、パン、回転、アニメーションをサポートし、簡単に拡張できるため、独自のオーバーレイやタッチイベント検出を追加できます。

7
Zikkoua

私は古い質問を知っていますが、これを正確に行うためにTileViewを使用しました:

https://github.com/moagrius/TileView

7
FRR

WorldMapアプリケーションのこの「整数化が容易」なソースを使用できます。

https://github.com/johnnylambada/WorldMap

これは世界地図の巨大な画像を使用し、キャッシュを使用して地図を表示します。

整数化するために、私はすべてのJavaファイル(5と思う))をコピーし、レイアウトファイルでsurfaceViewを使用しました。次に、ImageViewerActivity.Javaの小さなOnCreate()メソッドを実行し、私の活動のコード(私の個人的な使用に応じて、スライ変更)。

4
M. Usman Khan

この投稿 は、マルチタッチジェスチャを使用して画像をズームするための優れたデモです。マトリックスを使用して、画像をズームおよびパンします。

2
Ben Lee

巨大な画像の読み込み中にメモリ不足の例外を削除するには、次の手順に従う必要があります。

 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

1
hitesh141

スケーリングなどを処理し、フル解像度を使用するには、OSMのMapView(オープンストリートマップ)を使用して、タイルを(マップの代わりに)提供できます。これを確認してください: http://www.haakseth.com/?p=

1
M. Usman Khan