0

ギャラリーから画像ファイルを読み込もうとしていますが、期待される画像ではなく null になっています。私が使用しているコードは次のとおりです。

public static Bitmap decodeSampledBitmapFromStreem(InputStream is,
        int reqWidth, int reqHeight) {
    Bitmap b = null;
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeStream(is, null, options);
    options.inSampleSize = calculateInSampleSize(options, reqWidth,
            reqHeight);
    options.inJustDecodeBounds = false;
    b = BitmapFactory.decodeStream(is, null, options);
    return b;
}
public static int calculateInSampleSize(BitmapFactory.Options options,
        int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {
        if (width > height) {
            inSampleSize = Math.round((float) height / (float) reqHeight);
        } else {
            inSampleSize = Math.round((float) width / (float) reqWidth);
        }
    }
    return inSampleSize;
}

私のコードに何か問題がありますか? null になるのはなぜですか?

6 行目にコメントを付ければ、私のコードは小さな画像に対しては正常に動作することに注意してください。ただし、エラー ログに従って大きな画像に対してエラーが発生します。

05-17 11:37:46.277: E/AndroidRuntime(9224): FATAL EXCEPTION: AsyncTask #3
05-17 11:37:46.277: E/AndroidRuntime(9224): java.lang.RuntimeException: An error occured while executing doInBackground()
05-17 11:37:46.277: E/AndroidRuntime(9224):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
05-17 11:37:46.277: E/AndroidRuntime(9224):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
05-17 11:37:46.277: E/AndroidRuntime(9224):     at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
05-17 11:37:46.277: E/AndroidRuntime(9224):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
05-17 11:37:46.277: E/AndroidRuntime(9224):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
05-17 11:37:46.277: E/AndroidRuntime(9224):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
05-17 11:37:46.277: E/AndroidRuntime(9224):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
05-17 11:37:46.277: E/AndroidRuntime(9224):     at java.lang.Thread.run(Thread.java:1019)
05-17 11:37:46.277: E/AndroidRuntime(9224): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
05-17 11:37:46.277: E/AndroidRuntime(9224):     at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
05-17 11:37:46.277: E/AndroidRuntime(9224):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:470)
05-17 11:37:46.277: E/AndroidRuntime(9224):     at com.giftcard.GiftCard.decodeSampledBitmapFromStreem(GiftCard.java:454)
05-17 11:37:46.277: E/AndroidRuntime(9224):     at com.giftcard.GiftCard$MyBitmapDecoder.doInBackground(GiftCard.java:500)
05-17 11:37:46.277: E/AndroidRuntime(9224):     at com.giftcard.GiftCard$MyBitmapDecoder.doInBackground(GiftCard.java:1)
05-17 11:37:46.277: E/AndroidRuntime(9224):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
05-17 11:37:46.277: E/AndroidRuntime(9224):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
05-17 11:37:46.277: E/AndroidRuntime(9224):     ... 4 more
05-17 11:37:49.387: I/Process(9224): Sending signal. PID: 9224 SIG: 9
4

4 に答える 4

1

isnputStreamを複数回使用していることが原因である可能性があります。これは、BitmapFactory.decodeStream(is、null、options);の最初の使用を避けてください。

public static Bitmap decodeSampledBitmapFromStreem(InputStream is,
        int reqWidth, int reqHeight) {
    Bitmap b = null;
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    **BitmapFactory.decodeStream(is, null, options);**
    options.inSampleSize = calculateInSampleSize(options, reqWidth,
            reqHeight);
    options.inJustDecodeBounds = false;
    b = BitmapFactory.decodeStream(is, null, options);
    return b;
}
于 2012-05-17T05:52:35.943 に答える
0

代わりにdecodeByteArrayを試しましたか?

于 2012-05-17T08:50:13.530 に答える
0

ギャラリーから画像を取得するには、以下のコードを試してください

public class SelectPhotoFromGallery extends Activity 
{

private static final int SELECT_PICTURE = 1;
private String selectedImagePath="";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = new Intent();
  intent.setType("image/*");
  intent.setAction(Intent.ACTION_GET_CONTENT);
  intent.addCategory(Intent.CATEGORY_OPENABLE);
  intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  startActivityForResult(intent, SELECT_PICTURE); 
}

public String getPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE)
        {
            Uri selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);

        File imgFile = new  File(selectedImagePath);
 if(imgFile.exists()){

Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());

ImageView myImage = (ImageView) findViewById(R.id.imageviewTest);
myImage.setImageBitmap(myBitmap);

 }}}}}
于 2012-05-17T07:33:22.277 に答える
0

これはメモリ リークの問題です。

ここで解決策を見つけることができます:

画像を Bitmap オブジェクトにロードする際の奇妙なメモリ不足の問題

于 2012-05-17T06:32:14.577 に答える