从图库中获取图像并在 ImageView 中显示

Posted

技术标签:

【中文标题】从图库中获取图像并在 ImageView 中显示【英文标题】:Get Image from the Gallery and Show in ImageView 【发布时间】:2016-11-16 01:39:23 【问题描述】:

我需要通过单击按钮从图库中获取图像并将其显示到图像视图中。

我的做法如下:

    btn_image_button.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 

            getImageFromAlbum();
        
    );

方法定义如下:

   private void getImageFromAlbum()
    try
        Intent i = new Intent(Intent.ACTION_PICK,
                android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(i, RESULT_LOAD_IMAGE);
    catch(Exception exp)
        Log.i("Error",exp.toString());
    

活动结果方法是

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) 
        Uri selectedImage = data.getData();
        String[] filePathColumn =  MediaStore.Images.Media.DATA ;

        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();

        try 
            bmp = getBitmapFromUri(selectedImage);
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        

        image_view.setImageBitmap(bmp);

        //to know about the selected image width and height
        Toast.makeText(MainActivity.this, image_view.getDrawable().getIntrinsicWidth()+" & "+image_view.getDrawable().getIntrinsicHeight(), Toast.LENGTH_SHORT).show();
    



问题

我面临的问题是当图像分辨率很高时,假设图像大小为 5mp 到 13mp。它不会加载并显示在图像视图中。

但宽度和高度较低的图像已成功加载到图像视图中!

谁能告诉我代码的任何问题以及我做错了什么?我只想从图库中导入相机图像并在图像视图中显示它们!

【问题讨论】:

看看developer.android.com/training/displaying-bitmaps/… 您是否收到错误消息?还是无法加载图片? 它只是没有任何错误地加载图像! @antonio 我只想导入图像并在 imageview 中显示如何处理位图? 【参考方案1】:

你可以试试这个。

将此代码粘贴到您的按钮单击事件中。

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, RESULT_LOAD_IMG);

下面的代码是你的活动结果

@Override
    protected void onActivityResult(int reqCode, int resultCode, Intent data) 
        super.onActivityResult(reqCode, resultCode, data);


        if (resultCode == RESULT_OK) 
            try 
                final Uri imageUri = data.getData();
                final InputStream imageStream = getContentResolver().openInputStream(imageUri);
                final Bitmap selectedImage = BitmapFactory.decodeStream(imageStream);
                image_view.setImageBitmap(selectedImage);
             catch (FileNotFoundException e) 
                e.printStackTrace();
                Toast.makeText(PostImage.this, "Something went wrong", Toast.LENGTH_LONG).show();
            

        else 
            Toast.makeText(PostImage.this, "You haven't picked Image",Toast.LENGTH_LONG).show();
        
    

希望对你有帮助。

【讨论】:

正在旋转图像? 是的,我也遇到了同样的问题。图片是随机旋转的。 如果您有旋转问题,请查看我的回答:***.com/a/64013845/8491926【参考方案2】:

我使用以下代码: 此代码用于启动画廊活动。

 Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
 photoPickerIntent.setType("image/*");
 startActivityForResult(photoPickerIntent, GALLERY_REQUEST);

并得到结果:

 @Override
     public void onActivityResult(int requestCode, int resultCode, Intent data) 
         super.onActivityResult(requestCode, resultCode, data);
         if(resultCode == Activity.RESULT_OK)
         switch (requestCode)
             case GALLERY_REQUEST:
                 Uri selectedImage = data.getData();
                 try 
                     Bitmap bitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), selectedImage);
                     carImage.setImageBitmap(bitmap);
                  catch (IOException e) 
                     Log.i("TAG", "Some exception " + e);
                 
                 break;
         
     

别忘了在 AndroidManifest 中声明权限。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

【讨论】:

感谢 Anton 在 *** 上提供答案。通过解释步骤或原因,您可以大大提高答案的质量。不过,请投赞成票。 @D.Desai 你在 Fragment 中使用这个吗?如果您想在活动中使用此代码,请删除“getActivity()” @Anton 这个对我有用,谢谢。【参考方案3】:

因为 OnActivityResult 方法已被弃用,如今使用 AndroidX Activity 的正确方法是 Activity Result APIs,而推荐的方法是 see docs

"registerForActivityResult() 接受一个 ActivityResultContract 和一个 ActivityResultCallback 并返回一个您将使用的 ActivityResultLauncher启动其他活动。”

ActivityResultLauncher<String> mGetContent = registerForActivityResult(new ActivityResultContracts.GetContent(),
    new ActivityResultCallback<Uri>() 
        @Override
        public void onActivityResult(Uri uri) 
            previewImage.setImageURI(uri);
        
     );

然后简单地调用

mGetContent.launch("image/*");

在需要时。

【讨论】:

【参考方案4】:

我尝试了上述所有解决方案,但它们对我不起作用。我在 tutorialspoint 网站上看到了一个代码,它对我很有效,这就是代码:

    final int PICK_IMAGE = 100;

    Button button = findViewById(R.id.button33);
    button.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            Intent gallery = new Intent(Intent.ACTION_PICK,
             MediaStore.Images.Media.INTERNAL_CONTENT_URI);
             startActivityForResult(gallery, PICK_IMAGE);
        
    );


   @Override
    protected void onActivityResult(int reqCode, int resultCode, Intent data) 
    super.onActivityResult(reqCode, resultCode, data);

    Uri imageUri;
    ImageView imageView = findViewById(R.id.image_main_galary);

    if (resultCode == RESULT_OK && reqCode == 100)
        imageUri = data.getData();
        imageView.setImageURI(imageUri);
    
    

最重要的问题:不要忘记PERMISSION

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

【讨论】:

以上是关于从图库中获取图像并在 ImageView 中显示的主要内容,如果未能解决你的问题,请参考以下文章

从手机图库中获取随机图片并在视图中显示

Android:裁剪图像并在 ImageView 上显示

如何将图像从 Gallery 显示到 ImageView?

如何在 ImageView 中显示图库中的图像?

从 ImageView 获取图像

如何从远程源(url)获取图像并在ImageView中显示?