【问题标题】:Retrieve bitmap from uri从 uri 中检索位图
【发布时间】:2021-02-07 20:51:20
【问题描述】:

我已包含“通过 myApp 共享”选项。我在接收活动类中插入了以下代码。

    // Get the intent that started this activity
    Intent intent = getIntent();
    Uri data = intent.getData();

    // Figure out what to do based on the intent type
    if (intent.getType().indexOf("image/") != -1) {
        // Handle intents with image data ...
}

检索位图图像的下一步是什么。

【问题讨论】:

    标签: android android-bitmap


    【解决方案1】:

    因为你已经得到了 Uri。现在您必须在 getBitmap() 中传递该 Uri 以获取位图并使用该位图。

    Uri imageUri = intent.getData();
    Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),imageUri);
    Imageview my_img_view = (Imageview ) findViewById (R.id.my_img_view);
    my_img_view.setImageBitmap(bitmap);
    

    【讨论】:

    • @chintan khetiya 不幸的是,它会返回 FileNotFoundException 给我
    【解决方案2】:

    为了从 uri 中获取位图,

    Bitmap  mBitmap = Media.getBitmap(this.getContentResolver(), uri);
    

    希望对你有所帮助。

    【讨论】:

    • 还要记得从非主线程(后台线程)调用这个
    • @nikvs 这个 getBitmap() 方法目前已被弃用。
    【解决方案3】:
    Retrive bitmap from uri.....
    
    public static Bitmap decodeUriToBitmap(Context mContext, Uri sendUri) {
            Bitmap getBitmap = null;
            try {
                InputStream image_stream;
                try {
                    image_stream = mContext.getContentResolver().openInputStream(sendUri);
                    getBitmap = BitmapFactory.decodeStream(image_stream);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return getBitmap;
        }
    

    【讨论】:

    • 会出现哪些异常?
    • 什么都不需要try
    【解决方案4】:

    这对我有用

    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK)
    {
        Uri imageUri = data.getData();
        Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
    }
    }
    

    【讨论】:

    • 它在主线程中工作。编译器还会警告可能发生 IOException。
    【解决方案5】:

    你可以试试这个。您可以在 onActivityResult 方法中调用 setPic()。我在应用程序中使用它来拍照并将其放入 ImageView。

    private void setPic() {
    
        //currentPhotoPath contains path of image file.
        //visorFoto is a reference to an ImageView object.
        File file = new File(currentPhotoPath);
        Uri imageUri = Uri.fromFile(file);
        visorFoto.setImageURI(imageUri);
    
    }
    

    【讨论】:

      【解决方案6】:

      一旦你有了 Uri,你就可以使用类似的东西:-

      fun getBitmapFromUri(context: Context, uri: Uri): Bitmap? {
              
              var parcelFileDescriptor: ParcelFileDescriptor? = null
              return try {
                  parcelFileDescriptor = context.contentResolver.openFileDescriptor(uri, "r")
                  val fileDescriptor: FileDescriptor? = parcelFileDescriptor?.fileDescriptor
                  val image = BitmapFactory.decodeFileDescriptor(fileDescriptor)
                  parcelFileDescriptor?.close()
                  image
              } catch (e: Exception) {
                  //Log.e(TAG, "Failed to load image.", e)
                  null
              } finally {
                  try {
                      parcelFileDescriptor?.close()
                  } catch (e: IOException) {
                      e.printStackTrace()
                      //Log.e(TAG, "Error closing ParcelFile Descriptor")
                  }
              }
          }
      

      【讨论】:

        【解决方案7】:

        参考Android Developers documentation,您可以使用它从 URI 中获取位图

            ....
        
            Uri uri = intent.getData();
            try {
                Bitmap bitmap = getBitmapFromUri(uri);
                // do something with this bitmap
        
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        
        private Bitmap getBitmapFromUri(Uri uri) throws IOException {
            ParcelFileDescriptor parcelFileDescriptor = context.getContentResolver().openFileDescriptor(uri, "r");
            FileDescriptor fileDescriptor = parcelFileDescriptor.getFileDescriptor();
            Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor);
            parcelFileDescriptor.close();
            return image;
        }
        

        【讨论】:

          【解决方案8】:

          请选择此链接。

          这就是你要找的 How to get Bitmap from an Uri?

          试试这个对我有用:

          public static Bitmap getBitmapFromURL(String src) {
                  try {
                      System.out.printf("src", src);
                      URL url = new URL(src);
                      HttpURLConnection connection = (HttpURLConnection) url
                              .openConnection();
                      connection.setDoInput(true);
                      connection.connect();
                      InputStream input = connection.getInputStream();
                      Bitmap myBitmap = BitmapFactory.decodeStream(input);
                      System.out.printf("Bitmap", "returned");
                      myBitmap = Bitmap.createScaledBitmap(myBitmap, 100, 100, false);//This is only if u want to set the image size.
                      return myBitmap;
                  } catch (IOException e) {
                      e.printStackTrace();
                      System.out.printf("Exception", e.getMessage());
                      return null;
                  }
          

          【讨论】:

          • 仍然尝试从 Url 获取,它的 URI @nikvs 有最干净的解决方案(使用 MediaStore 类中的 getBitmap 辅助方法)
          猜你喜欢
          • 2013-12-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-24
          • 2013-11-15
          相关资源
          最近更新 更多