4

imageView 内で画像を回転させ、同じ画像でビットマップを回転させようとしています。

(後でサーバーに画像を送信するため、そのビットマップが必要です)

コード:

image.setOnClickListener(new OnClickListener() {
    public void onClick(View view) {
        mPhoto=rotate(mPhoto,90);
        image.setImageBitmap(mPhoto); 
    }
});

回転()メソッド:

public static Bitmap rotate(Bitmap src, float degree) {
        // create new matrix
        Matrix matrix = new Matrix();
        // setup rotation degree
        matrix.postRotate(degree);
        // return new bitmap rotated using matrix
        return Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, true);
    }

ログキャット:

08-29 23:14:34.964: W/dalvikvm(20087): threadid=1: thread exiting with uncaught exception (group=0x41505930)
08-29 23:14:34.968: E/AndroidRuntime(20087): FATAL EXCEPTION: main
08-29 23:14:34.968: E/AndroidRuntime(20087): java.lang.OutOfMemoryError
08-29 23:14:34.968: E/AndroidRuntime(20087):    at android.graphics.Bitmap.nativeCreate(Native Method)
08-29 23:14:34.968: E/AndroidRuntime(20087):    at android.graphics.Bitmap.createBitmap(Bitmap.java:689)
08-29 23:14:34.968: E/AndroidRuntime(20087):    at android.graphics.Bitmap.createBitmap(Bitmap.java:666)
08-29 23:14:34.968: E/AndroidRuntime(20087):    at android.graphics.Bitmap.createBitmap(Bitmap.java:599)
08-29 23:14:34.968: E/AndroidRuntime(20087):    at com.example.free.Add.rotate(Add.java:356)
08-29 23:14:34.968: E/AndroidRuntime(20087):    at com.example.free.Add$5.onClick(Add.java:137)
08-29 23:14:34.968: E/AndroidRuntime(20087):    at android.view.View.performClick(View.java:4211)
08-29 23:14:34.968: E/AndroidRuntime(20087):    at android.view.View$PerformClick.run(View.java:17362)
08-29 23:14:34.968: E/AndroidRuntime(20087):    at android.os.Handler.handleCallback(Handler.java:725)
08-29 23:14:34.968: E/AndroidRuntime(20087):    at android.os.Handler.dispatchMessage(Handler.java:92)
08-29 23:14:34.968: E/AndroidRuntime(20087):    at android.os.Looper.loop(Looper.java:137)
08-29 23:14:34.968: E/AndroidRuntime(20087):    at android.app.ActivityThread.main(ActivityThread.java:5227)
08-29 23:14:34.968: E/AndroidRuntime(20087):    at java.lang.reflect.Method.invokeNative(Native Method)
08-29 23:14:34.968: E/AndroidRuntime(20087):    at java.lang.reflect.Method.invoke(Method.java:511)
08-29 23:14:34.968: E/AndroidRuntime(20087):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
08-29 23:14:34.968: E/AndroidRuntime(20087):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
08-29 23:14:34.968: E/AndroidRuntime(20087):    at dalvik.system.NativeStart.main(Native Method)

あなたが私を助けてくれることを願っています。

タイ!

4

5 に答える 5

1

ファイルをデコードするときにこれを試してください

File imgFile = new File("yourPath");
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 10;
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath(), options);

それからあなたは電話します

rotate(myBitmap,90);

BitmapFactory.Optionsドキュメントから:

public intSampleSize

API レベル 1 で追加されました。値 > 1 に設定すると、メモリを節約するために小さい画像を返し、元の画像をサブサンプリングするようにデコーダーに要求します。サンプル サイズは、デコードされたビットマップ内の 1 つのピクセルに対応する、いずれかの次元のピクセル数です。たとえば、inSampleSize == 4 は、オリジナルの幅/高さの 1/4、ピクセル数の 1/16 のイメージを返します。任意の値 <= 1 は 1 と同じように扱われます。注: デコーダーは 2 の累乗に基づく最終値を使用します。その他の値は最も近い 2 の累乗に切り捨てられます。

お役に立てれば

于 2013-08-29T20:31:05.047 に答える
1

あなたのコメントを考慮して: 2560X1920. Its big, but I have to find a way to fit it in.. @gunar - I have to show this image to the user before sending it to the server.

ユーザーに画像を表示するには、最初にサイズを変更する必要があります。ビットマップを効率的に読み込んで表示する方法に関する有名な開発者の記事に従ってください。

ただし、これを行う場合、幅と高さのパラメーターを計算するときに回転を考慮する必要があります ( Exifinfo を使用していると思います)。

大きな画像をサーバーに送信するのは難しいです。大きな画像を回転する方法に関するこの投稿を見たことがありますが、それを試す時間がありませんでした. アイデアは、別のターゲット ビットマップでビットマップ マトリックスを回転させることです。

ただし、サーバー側で画像を回転させるか、自分のものではないためにサーバー側で変更できない場合は、独自のプロキシサーバーを作成し、画像をそのインスタンスに送信してそこで回転させることをお勧めしますそこから、回転した画像を初期サーバーに送信します (Android クライアントが通常送信するデータを転送することにより)。

于 2013-08-29T20:41:45.600 に答える
0

SO にも投稿されているこの関連する問題をご覧ください。

回転されたビットマップに対していくつかの呼び出しを行う必要があるように見えるrecycle()ため、回転されていない古いバージョンのビットマップが使用されないと仮定して、それに割り当てられたメモリが解放されます。

Bitmapクラスのドキュメントもご覧ください

于 2013-08-29T20:31:59.457 に答える
0

回転するたびにサイズ 2560 x 1920 の新しいビットマップを割り当てるのではなく、 ImageViewと同じスコープでandroid.graphics.Matrixへの参照を保持して使用してみませんか?image.setScaleType(ScaleType.MATRIX); image.setImageMatrix(matrix);

回転メソッドは次のようになります。

if (mMatrix == null) {
    mMatrix = new Matrix();
}
mMatrix.postRotate(degrees);
mImageView.setImageMatrix(mMatrix);
于 2013-08-29T20:36:49.063 に答える
0

最適化を開始する前に、単にエミュレーターではなく、実際のターゲット デバイスでメモリが不足していることを確認します。デバイス自体で正常に動作している場合は、VM シナリオで heapSize を確認してください。タグで android:largeHeap="true" を設定することにより、マニフェストを介してデバイスの追加メモリをリクエストすることもできます。これらの手順を実行した後も、デバイスの制限にまだ直面している場合は、最適化する必要があります.

特定のデバイスでは、このような大きなビットマップに対して画像操作が単純に負担が大きすぎる可能性があります。これをサーバーに送信する計画があることを確認しました。それでは、サーバー側で表示するために画像を適切に回転させたいと思いますか? その場合、Python を使用している場合は、たとえば PIL を使用して、いつでもそこで画像操作を行うことができます。ちょっとした考え。

幸運を祈ります。

于 2013-08-29T20:38:44.883 に答える