How to get a Uri object from Bitmap

后端 未结 7 1618
醉话见心
醉话见心 2020-12-09 15:55

On a certain tap event, I ask the user to add an image. So I provide two options:

  1. To add from gallery.
  2. To click a new image from camera.
相关标签:
7条回答
  • 2020-12-09 16:42

    This is what worked for me. For example getting thumbnail from a video in the form of a bitmap. Then we can convert the bitmap object to uri object.

    String videoPath = mVideoUri.getEncodedPath();
    System.out.println(videoPath); //prints to console the path of the saved video
    Bitmap thumb = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Images.Thumbnails.MINI_KIND);
    
     Uri thumbUri = getImageUri(this, thumb);
    
    0 讨论(0)
  • 2020-12-09 16:44

    Note : if you are using android 6.0 or greater version path will give null value. so you have to add permission <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    public void onClicked(View view){
            Bitmap bitmap=getBitmapFromView(scrollView,scrollView.getChildAt(0).getHeight(),scrollView.getChildAt(0).getWidth());
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG,90,baos);
            String path = MediaStore.Images.Media.insertImage(getContentResolver(),bitmap,"title",null);
            Intent intent = new Intent(Intent.ACTION_SEND);
            intent.setType("image/jpeg");
            intent.putExtra(Intent.EXTRA_STREAM,Uri.parse(path));
            startActivity(Intent.createChooser(intent,"Share Screenshot Using"));
        }
    
    0 讨论(0)
  • 2020-12-09 16:46

    if you get image from camera there is no way to get Uri from a bitmap, so you should save your bitmap first.

    launch camera intent

    startActivityForResult(Intent(MediaStore.ACTION_IMAGE_CAPTURE), 8)
    

    then, override

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    
        if (resultCode == Activity.RESULT_OK && requestCode == 8) {
            val bitmap = data?.extras?.get("data") as Bitmap
    
            val uri = readWriteImage(bitmap)
        }
    }
    

    also create method to store bitmap and then return the Uri

    fun readWriteImage(bitmap: Bitmap): Uri {
        // store in DCIM/Camera directory
        val dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
        val cameraDir = File(dir, "Camera/")
    
        val file = if (cameraDir.exists()) {
            File(cameraDir, "LK_${System.currentTimeMillis()}.png")
        } else {
            cameraDir.mkdir()
            File(cameraDir, "LK_${System.currentTimeMillis()}.png")
        }
    
        val fos = FileOutputStream(file)
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos)
        fos.flush()
        fos.close()
    
        Uri.fromFile(file)
    }
    

    PS: dont forget to Add Permission and handle runtime permission (API >= 23)

    0 讨论(0)
  • 2020-12-09 16:49

    Try to use the below Code. May be helpful to you:

    new AsyncTask<Void, Integer, Void>() {
                protected void onPreExecute() {
                };
    
                @Override
                protected Void doInBackground(Void... arg0) {
                    imageAdapter.images.clear();
                    initializeVideoAndImage();
                    return null;
                }
    
                protected void onProgressUpdate(Integer... integers) {
                    imageAdapter.notifyDataSetChanged();
                }
    
                public void initializeVideoAndImage() {
                    final String[] columns = { MediaStore.Images.Media.DATA, MediaStore.Images.Thumbnails._ID };
                    String orderBy = MediaStore.Images.Media._ID;
                    Cursor imageCursor = managedQuery(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, orderBy);
    
                    final String[] videocolumns = { MediaStore.Video.Thumbnails._ID, MediaStore.Video.Media.DATA };
                    orderBy = MediaStore.Video.Media._ID;
                    Cursor videoCursor = managedQuery(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, videocolumns, null, null, orderBy);
                    int i = 0;
                    int image_column_index = 0;
    
                    if (imageCursor != null) {
                        image_column_index = imageCursor.getColumnIndex(MediaStore.Images.Media._ID);
                        int count = imageCursor.getCount();
                        for (i = 0; i < count; i++) {
                            imageCursor.moveToPosition(i);
                            int id = imageCursor.getInt(image_column_index);
                            ImageItem imageItem = new ImageItem();
                            imageItem.id = id;
                            imageAdapter.images.add(imageItem);
    
                        }
                    }
    
                    if (videoCursor != null) {
                        image_column_index = videoCursor.getColumnIndex(MediaStore.Video.Media._ID);
                        int count = videoCursor.getCount();
                        for (i = 0; i < count; i++) {
                            videoCursor.moveToPosition(i);
                            int id = videoCursor.getInt(image_column_index);
                            ImageItem imageItem = new ImageItem();
                            imageItem.id = id;
                            imageAdapter.images.add(imageItem);
                        }
                    }
                    publishProgress(i);
                    if (imageCursor != null) {
                        image_column_index = imageCursor.getColumnIndex(MediaStore.Images.Media._ID);
                        int count = imageCursor.getCount();
                        for (i = 0; i < count; i++) {
                            imageCursor.moveToPosition(i);
                            int id = imageCursor.getInt(image_column_index);
                            int dataColumnIndex = imageCursor.getColumnIndex(MediaStore.Images.Media.DATA);
                            ImageItem imageItem = imageAdapter.images.get(i);
                            Bitmap img = MediaStore.Images.Thumbnails.getThumbnail(getApplicationContext().getContentResolver(), id, MediaStore.Images.Thumbnails.MICRO_KIND, null);
                            int column_index = imageCursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                            imageItem.imagePath = imageCursor.getString(column_index);
                            imageItem.videoPath = "";
                            try {
                                File imageFile = new File(Environment.getExternalStorageDirectory(), "image" + i);
                                imageFile.createNewFile();
                                ByteArrayOutputStream bos = new ByteArrayOutputStream();
    
                                if (bos != null && img != null) {
                                    img.compress(Bitmap.CompressFormat.PNG, 100, bos);
                                }
                                byte[] bitmapData = bos.toByteArray();
                                FileOutputStream fos = new FileOutputStream(imageFile);
                                fos.write(bitmapData);
                                fos.close();
                                imageItem.thumbNailPath = imageFile.getAbsolutePath();
                                try {
                                    boolean cancelled = isCancelled();
                                    // if async task is not cancelled, update the
                                    // progress
                                    if (!cancelled) {
                                        publishProgress(i);
                                        SystemClock.sleep(100);
    
                                    }
    
                                } catch (Exception e) {
                                    Log.e("Error", e.toString());
                                }
                                // publishProgress();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                            // imageAdapter.images.add(imageItem);
                        }
                    }
                    imageCursor.close();
    
                    if (videoCursor != null) {
                        image_column_index = videoCursor.getColumnIndex(MediaStore.Video.Media._ID);
                        int count = videoCursor.getCount() + i;
                        for (int j = 0; i < count; i++, j++) {
                            videoCursor.moveToPosition(j);
                            int id = videoCursor.getInt(image_column_index);
                            int column_index = videoCursor.getColumnIndexOrThrow(MediaStore.Video.Media.DATA);
                            ImageItem imageItem = imageAdapter.images.get(i);
                            imageItem.imagePath = videoCursor.getString(column_index);
                            imageItem.videoPath = imageItem.imagePath;
                            System.out.println("External : " + imageItem.videoPath);
                            try {
                                File imageFile = new File(Environment.getExternalStorageDirectory(), "imageV" + i);
                                imageFile.createNewFile();
                                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                                MediaMetadataRetriever mediaVideo = new MediaMetadataRetriever();
                                mediaVideo.setDataSource(imageItem.videoPath);
                                Bitmap videoFiles = mediaVideo.getFrameAtTime();
                                videoFiles = ThumbnailUtils.extractThumbnail(videoFiles, 96, 96);
                                if (bos != null && videoFiles != null) {
                                    videoFiles.compress(Bitmap.CompressFormat.JPEG, 100, bos);
    
                                }
                                byte[] bitmapData = bos.toByteArray();
                                FileOutputStream fos = new FileOutputStream(imageFile);
                                fos.write(bitmapData);
                                fos.close();
                                imageItem.imagePath = imageFile.getAbsolutePath();
                                imageItem.thumbNailPath = imageFile.getAbsolutePath();
                                try {
                                    boolean cancelled = isCancelled();
                                    // if async task is not cancelled, update the
                                    // progress
                                    if (!cancelled) {
                                        publishProgress(i);
                                        SystemClock.sleep(100);
    
                                    }
    
                                } catch (Exception e) {
                                    Log.e("Error", e.toString());
                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
    
                        }
                    }
                    videoCursor.close();
                }
    
                protected void onPostExecute(Void result) {
                    imageAdapter.notifyDataSetChanged();
                };
    
            }.execute();
    
        }
    
    0 讨论(0)
  • 2020-12-09 16:50

    I have same problem in my project, so i follow the simple method (click here) to get Uri from bitmap.

    public Uri getImageUri(Context inContext, Bitmap inImage) {
      ByteArrayOutputStream bytes = new ByteArrayOutputStream();
      inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
      String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
      return Uri.parse(path);
    } 
    
    0 讨论(0)
  • 2020-12-09 16:56
    Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    

    the line mentioned above create a thumbnail using bitmap, that may consume some extra space in your android device.

    This method may help you to get the Uri from bitmap without consuming some extra memory.

    public Uri bitmapToUriConverter(Bitmap mBitmap) {
       Uri uri = null;
       try {
        final BitmapFactory.Options options = new BitmapFactory.Options();
        // Calculate inSampleSize
        options.inSampleSize = calculateInSampleSize(options, 100, 100);
    
        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        Bitmap newBitmap = Bitmap.createScaledBitmap(mBitmap, 200, 200,
                true);
        File file = new File(getActivity().getFilesDir(), "Image"
                + new Random().nextInt() + ".jpeg");
        FileOutputStream out = getActivity().openFileOutput(file.getName(),
                Context.MODE_WORLD_READABLE);
        newBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
        out.flush();
        out.close();
        //get absolute path
        String realPath = file.getAbsolutePath();
        File f = new File(realPath);
        uri = Uri.fromFile(f);
    
      } catch (Exception e) {
        Log.e("Your Error Message", e.getMessage());
      }
    return uri;
    }
    
    
    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) {
    
            final int halfHeight = height / 2;
            final int halfWidth = width / 2;
    
            // Calculate the largest inSampleSize value that is a power of 2 and keeps both
            // height and width larger than the requested height and width.
            while ((halfHeight / inSampleSize) >= reqHeight
                    && (halfWidth / inSampleSize) >= reqWidth) {
                inSampleSize *= 2;
            }
        }
    
        return inSampleSize;
    }
    

    for more details goto Loading Large Bitmaps Efficiently

    0 讨论(0)
提交回复
热议问题