如何从Uri中获得位图对象(如果我成功地将它存储在 /data/data/MYFOLDER/myimage.png或文件///data/data/MYFOLDER/myimage.png)在我的应用程序中使用它?
有人知道怎么做到吗?
如何从Uri中获得位图对象(如果我成功地将它存储在 /data/data/MYFOLDER/myimage.png或文件///data/data/MYFOLDER/myimage.png)在我的应用程序中使用它?
有人知道怎么做到吗?
当前回答
MediaStore.Images.Media.getBitmap在API 29中已弃用。推荐的方法是使用ImageDecoder。在API 28中添加的createSource。
下面是如何获得位图:
val bitmap = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
ImageDecoder.decodeBitmap(ImageDecoder.createSource(requireContext().contentResolver, imageUri))
} else {
MediaStore.Images.Media.getBitmap(requireContext().contentResolver, imageUri)
}
重要:ImageDecoder.decodeBitmap读取EXIF方向,媒体。getBitmap不
其他回答
try
{
Bitmap bitmap = MediaStore.Images.Media.getBitmap(c.getContentResolver() , Uri.parse(paths));
}
catch (Exception e)
{
//handle exception
}
yes路径必须是这样的格式
file:///mnt/sdcard/filename.jpg
(芬兰湾的科特林) 所以,截至2020年4月7日,上述选项都没用,但以下是对我有效的:
如果你想在val中存储位图,并设置一个imageView,使用这个: val bitmap = BitmapFactory.decodeFile(currentPhotoPath).also {bitmap -> imageView.setImageBitmap(bitmap)} 如果你只是想设置位图为和imageView,使用这个: BitmapFactory.decodeFile(currentPhotoPath).also {bitmap -> imageView.setImageBitmap(bitmap)}
现在我在Kotlin中使用下面的方法
PICK_IMAGE_REQUEST ->
data?.data?.let {
val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(it))
imageView.setImageBitmap(bitmap)
}
下面是正确的做法:
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);
}
}
如果你需要加载非常大的图像,下面的代码将以tile的形式加载它(避免大的内存分配):
BitmapRegionDecoder decoder = BitmapRegionDecoder.newInstance(myStream, false);
Bitmap region = decoder.decodeRegion(new Rect(10, 10, 50, 50), null);
点击这里查看答案
ContentResolver cr = context.getContentResolver();
try (InputStream input = cr.openInputStream(url)) {
Bitmap bitmap = BitmapFactory.decodeStream(input);
}