1

一部のデバイスでは 2048 を超える画像が表示されないため、ビットマップを調整してサイズを調整しようとしています。

解決策を見つけましたが、写真を選択/撮影するとアプリがクラッシュします。

そのコード: (onActivityResult 内)

currImageURI = data.getData();
                path=(getRealPathFromURI(currImageURI));

                Drawable d = Drawable.createFromPath(path);
                image.setVisibility(View.VISIBLE);
                mPhoto=drawableToBitmap(d);
                Bitmap sized = mPhoto;
                if(mPhoto.getHeight()>=2048||mPhoto.getWidth()>=2048){
                sized = Bitmap.createScaledBitmap(mPhoto, (int)(mPhoto.getWidth()*0.8), (int)(mPhoto.getHeight()*0.8), false);
                }

                image.setImageBitmap(sized);

LogCat:

08-28 22:48:14.873: E/AndroidRuntime(12047): FATAL EXCEPTION: main
08-28 22:48:14.873: E/AndroidRuntime(12047): java.lang.OutOfMemoryError
08-28 22:48:14.873: E/AndroidRuntime(12047):    at android.graphics.Bitmap.nativeCreate(Native Method)
08-28 22:48:14.873: E/AndroidRuntime(12047):    at android.graphics.Bitmap.createBitmap(Bitmap.java:640)
08-28 22:48:14.873: E/AndroidRuntime(12047):    at android.graphics.Bitmap.createBitmap(Bitmap.java:586)
08-28 22:48:14.873: E/AndroidRuntime(12047):    at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:466)
08-28 22:48:14.873: E/AndroidRuntime(12047):    at com.example.free.Add.onActivityResult(Add.java:149)
08-28 22:48:14.873: E/AndroidRuntime(12047):    at android.app.Activity.dispatchActivityResult(Activity.java:5231)
08-28 22:48:14.873: E/AndroidRuntime(12047):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3172)
08-28 22:48:14.873: E/AndroidRuntime(12047):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3219)
08-28 22:48:14.873: E/AndroidRuntime(12047):    at android.app.ActivityThread.access$1200(ActivityThread.java:134)
08-28 22:48:14.873: E/AndroidRuntime(12047):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
08-28 22:48:14.873: E/AndroidRuntime(12047):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-28 22:48:14.873: E/AndroidRuntime(12047):    at android.os.Looper.loop(Looper.java:137)
08-28 22:48:14.873: E/AndroidRuntime(12047):    at android.app.ActivityThread.main(ActivityThread.java:4856)
08-28 22:48:14.873: E/AndroidRuntime(12047):    at java.lang.reflect.Method.invokeNative(Native Method)
08-28 22:48:14.873: E/AndroidRuntime(12047):    at java.lang.reflect.Method.invoke(Method.java:511)
08-28 22:48:14.873: E/AndroidRuntime(12047):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
08-28 22:48:14.873: E/AndroidRuntime(12047):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
08-28 22:48:14.873: E/AndroidRuntime(12047):    at dalvik.system.NativeStart.main(Native Method)

149行目は次のとおりです。

sized = Bitmap.createScaledBitmap(mPhoto, (int)(mPhoto.getWidth()*0.8), (int)(mPhoto.getHeight()*0.8), false);

クラッシュしないようにするにはどうすればよいか教えてください。ありがとう!

アップデート:

アプリはまだクラッシュします:

08-28 23:24:20.219: W/dalvikvm(16289): threadid=1: thread exiting with uncaught exception (group=0x412552a0)   
08-28 23:18:59.917: E/AndroidRuntime(15286): FATAL EXCEPTION: main
    08-28 23:18:59.917: E/AndroidRuntime(15286): java.lang.OutOfMemoryError
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at android.graphics.Bitmap.nativeCreate(Native Method)
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at android.graphics.Bitmap.createBitmap(Bitmap.java:640)
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at android.graphics.Bitmap.createBitmap(Bitmap.java:586)
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at com.example.free.Add.getResizedBitmap(Add.java:335)
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at com.example.free.Add.onActivityResult(Add.java:150)
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at android.app.Activity.dispatchActivityResult(Activity.java:5231)
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3172)
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3219)
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at android.app.ActivityThread.access$1200(ActivityThread.java:134)
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at android.os.Handler.dispatchMessage(Handler.java:99)
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at android.os.Looper.loop(Looper.java:137)
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at android.app.ActivityThread.main(ActivityThread.java:4856)
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at java.lang.reflect.Method.invokeNative(Native Method)
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at java.lang.reflect.Method.invoke(Method.java:511)
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
    08-28 23:18:59.917: E/AndroidRuntime(15286):    at dalvik.system.NativeStart.main(Native Method)

コード:

currImageURI = data.getData();
                path=(getRealPathFromURI(currImageURI));

                Drawable d = Drawable.createFromPath(path);
                image.setVisibility(View.VISIBLE);
                mPhoto=drawableToBitmap(d);
                Bitmap sized = mPhoto;
                if(mPhoto.getHeight()>=2048||mPhoto.getWidth()>=2048){
                    sized=getResizedBitmap(mPhoto,(int)(mPhoto.getHeight()*0.8),(int)(mPhoto.getWidth()*0.8));
                }

                image.setImageBitmap(sized);         
4

1 に答える 1

1

私の関連する質問を見てください:

高解像度画像 - OutOfMemoryError

イメージを Drawables フォルダーに入れることをお勧めします。そこから、以下のコードを使用して適切なサイズでロードします。これにより、アプリのメモリ使用量が削減され、常に必要な量のメモリのみが使用されます。

メモリ内にビットマップのインスタンスが 1 つだけあることを確認してください。表示したら、呼び出しrecycle()て参照を null に設定します。

画像をロードする方法は次のとおりです。

public  Bitmap scaleDownBitmap(Bitmap photo, int newHeight) {

     final float densityMultiplier = getResources().getDisplayMetrics().density;

     int h= (int) (newHeight*densityMultiplier);
     int w= (int) (h * photo.getWidth()/((double) photo.getHeight()));

     photo = Bitmap.createScaledBitmap(photo, w, h, true);

     return photo;
}

次のように使用します。

ImageView.setImageBitmap(scaleDownBitmap(youroldbitmap, 300));

newHeight に大きすぎる値を使用しないように注意し、densityMultiplierに留意してください。

取得元:ビットマップをウィジェットに動的に配置するときにバインダー トランザクションが失敗する

于 2013-08-28T19:59:46.693 に答える