2017-01-10 7 views
0

ギャレーから画像をロードしてImageViewに表示すると、画像が黒くなります。しかし、すべてのイメージではなく、ただ確実です。なぜこれが起こるのだろうか?ギャラリーからのimageViewの画像読み込みが黒くなる

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     switch (requestCode) { 

     case RESULT_LOAD_IMAGE: 
      if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK & null != data) { 
       imageUri = data.getData(); 
       imageView.setImageURI(imageUri); 
      } 
      break; 
     } 
    } 

次にこの方法を試しました。イメージは表示されますが、ぼやけて見えます。

imageView.setImageBitmap(decodeUri(imageUri)); 

private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException { 
     BitmapFactory.Options o = new BitmapFactory.Options(); 
     o.inJustDecodeBounds = true; 
     BitmapFactory.decodeStream(
       getContentResolver().openInputStream(selectedImage), null, o); 

     final int REQUIRED_SIZE = 100; 

     int width_tmp = o.outWidth, height_tmp = o.outHeight; 
     int scale = 1; 
     while (true) { 
      if (width_tmp/2 < REQUIRED_SIZE || height_tmp/2 < REQUIRED_SIZE) { 
       break; 
      } 
      width_tmp /= 2; 
      height_tmp /= 2; 
      scale *= 2; 
     } 

     BitmapFactory.Options o2 = new BitmapFactory.Options(); 
     o2.inSampleSize = scale; 
     return BitmapFactory.decodeStream(
       getContentResolver().openInputStream(selectedImage), null, o2); 
    } 

答えて

2

はい、それは起こります2048*2048の画像の高さと幅が大きいため、Bitmapを読み込めない場合。カメラで撮影した画像は通常サイズが大きいので、画像のサイズを変更することをお勧めします。以下は

サイズが大きな場合クロップ画像の一例であり、画像比率の世話をしない

public class InputImageCompressor extends Activity{ 

public static void compressInputImage(Intent data, Context context, ImageView newIV) 
{ 
    Bitmap bitmap; 
    Uri inputImageData = data.getData(); 
    try 
    { 
     Bitmap bitmapInputImage = MediaStore.Images.Media.getBitmap(context.getContentResolver(), inputImageData); 
     if (bitmapInputImage.getWidth() > 2048 && bitmapInputImage.getHeight() > 2048) 
     { 
      bitmap = Bitmap.createScaledBitmap(bitmapInputImage, 1024, 1280, true); 
      newIV.setImageBitmap(bitmap); 
     } 
     else if (bitmapInputImage.getWidth() > 2048 && bitmapInputImage.getHeight() < 2048) 
     { 
      bitmap = Bitmap.createScaledBitmap(bitmapInputImage, 1920, 1200, true); 
      newIV.setImageBitmap(bitmap); 
     } 
     else if (bitmapInputImage.getWidth() < 2048 && bitmapInputImage.getHeight() > 2048) 
     { 
      bitmap = Bitmap.createScaledBitmap(bitmapInputImage, 1024, 1280, true); 
      newIV.setImageBitmap(bitmap); 
     } 
     else if (bitmapInputImage.getWidth() < 2048 && bitmapInputImage.getHeight() < 2048) 
     { 
      bitmap = Bitmap.createScaledBitmap(bitmapInputImage, bitmapInputImage.getWidth(), bitmapInputImage.getHeight(), true); 
      newIV.setImageBitmap(bitmap); 
     } 
    } catch (Exception e) 
    { 
     Toast.makeText(context, e.toString(), Toast.LENGTH_LONG).show(); 
    } 
    } 
} 

としてあなたonActivityResultでこれを使用します。

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    switch (requestCode) { 

    case RESULT_LOAD_IMAGE: 
     if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK & null != data) { 
      InputImageCompressor.compressInputImage(data, your_activity_context.this, imageView); 
     } 
     break; 
    } 
} 
1

コードは大丈夫ですが、ぼやけた画像が表示されていることも確認できます。

REQUIRED_SIZEが、あなたが試しているデバイスにとって小さすぎると思います。まず、REQUIRED_SIZEをもっと大きなものに設定してみてください。 350を使用して、画質を向上させるかどうかを確認します。それがない場合は代わりに静的に「サイズ」を置くこと、そして、活動の中から、以下を使用する(または少なくともビュー)、REQUIRED_SIZE = SCREEN_WIDTH

がSCREEN_WIDTHを見つけるために使用:

DisplayMetrics displaymetrics = new DisplayMetrics(); 
((Activity) getContext()).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 
int SCREEN_WIDTH = displaymetrics.widthPixels; 
関連する問題