簡體   English   中英

圖庫中imageView中的圖像加載變黑

[英]Image load in imageView from gallery become black

因此,我從廚房加載圖像並將其顯示到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);
    }

是的,當由於圖像的高度和寬度較大(為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;
     }
 }

該代碼看起來不錯,您看到的圖像也很模糊,這也證實了這一點。

我認為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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM