【问题标题】:How to get a Uri object from Bitmap如何从位图中获取 Uri 对象
【发布时间】:2012-09-15 08:17:30
【问题描述】:

在某个点击事件中,我要求用户添加图像。所以我提供了两种选择:

  1. 从图库添加。
  2. 点击相机中的新图像。

我的目标是保留与这些图像相关的“uri”列表。

如果用户选择画廊,那么我会得到图像 uri(这很简单)。 但是如果他选择了相机,那么在拍照后,我就得到了那张照片的 Bitmap 对象。

现在如何将该位图对象转换为 uri,或者换句话说,如何获取该位图对象的相对 Uri 对象?

谢谢。

【问题讨论】:

标签: android bitmap uri


【解决方案1】:

我的项目也有同样的问题,所以我按照简单的方法(click here)从位图中获取 Uri。

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);
} 

【讨论】:

  • Images.Media.insertImage 现在是 MediaStore.Images.Media.insertImage 添加此权限需要记住的第二件事:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • 它在 android 6.0 中返回空路径
  • 两个棉花糖设备,摩托罗拉returns path 和三星returns null。有什么帮助吗?
  • 如何从存储中删除这个插入的位图文件?
  • @AnandSavjani 你修好了吗?
【解决方案2】:
Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);

上面提到的行使用位图创建缩略图,这可能会占用你的安卓设备中的一些额外空间。

此方法可以帮助您从位图中获取 Uri 而不会消耗一些额外的内存。

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;
}

更多详情请转至Loading Large Bitmaps Efficiently

【讨论】:

  • calculateInSampleSize 是什么?请为其添加方法
  • @Anand : 这个stackoverflow.com/questions/2641726/… 可以帮助你,如果你找到合适的解决方案,请告知。
  • 您可以忽略 inSampleSize。将 samplesize 设置为 2 会将图像质量降低 2,就好像只取图像的每个第二个像素一样。设置 1 或不设置此选项都可以。
  • 我可以确认我所说的关于 inSampleSize 的内容。此外,如果图像不是矩形,这种方法会扭曲图像。要处理矩形以外的图像,请使用此行 Bitmap newBitmap = Bitmap.createScaledBitmap(mBitmap, mBitmap.getWidth(), mBitmap.getHeight(), true);
  • 这总是为我返回 null。
【解决方案3】:

这对我有用。例如,以位图的形式从视频中获取缩略图。然后我们可以将位图对象转换为uri对象。

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);

【讨论】:

  • 什么是 getImageUri
【解决方案4】:

我尝试了post I mentioned in my comment.. 中的以下代码 sn-p,它对我来说工作正常。

/**
 * Gets the last image id from the media store
 * 
 * @return
 */
private int getLastImageId() {
    final String[] imageColumns = { MediaStore.Images.Media._ID,
            MediaStore.Images.Media.DATA };
    final String imageOrderBy = MediaStore.Images.Media._ID + " DESC";
    Cursor imageCursor = managedQuery(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, imageColumns,
            null, null, imageOrderBy);
    if (imageCursor.moveToFirst()) {
        int id = imageCursor.getInt(imageCursor
                .getColumnIndex(MediaStore.Images.Media._ID));
        String fullPath = imageCursor.getString(imageCursor
                .getColumnIndex(MediaStore.Images.Media.DATA));
        Log.d(getClass().getSimpleName(), "getLastImageId::id " + id);
        Log.d(getClass().getSimpleName(), "getLastImageId::path "
                + fullPath);
        imageCursor.close();
        return id;
    } else {
        return 0;
    }
}

在 logcat 中输出:

09-24 16:36:24.500: getLastImageId::id 70
09-24 16:36:24.500: getLastImageId::path /mnt/sdcard/DCIM/Camera/2012-09-24 16.36.20.jpg

我在上面的代码 sn-p 中也没有看到任何硬编码的名称。 希望这会有所帮助。

【讨论】:

    【解决方案5】:

    注意:如果您使用的是 android 6.0 或更高版本,路径将给出 null 值。 所以你必须添加权限 <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"));
        }
    

    【讨论】:

      【解决方案6】:

      尝试使用以下代码。可能对你有帮助:

      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();
      
          }
      

      【讨论】:

        猜你喜欢
        • 2011-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-15
        相关资源
        最近更新 更多