将字符串转换为uri到位图以在ImageView中显示

dca*_*bal 1 memory android uri bitmap preference

我已经看了一遍解决我的问题,似乎无法弄明白.我敢肯定它可能是1或2条简单的线条,希望有人可以引导我朝着正确的方向前进.

在我的应用中,用户可以单击将打开图库的按钮.一旦他们选择了图像,它就会在我的应用程序中的ImageView中显示该图像.那部分工作得非常好.最初,我只是从画廊返回一个uri,我会直接显示:

imageView1.setImageURI(myUri);
Run Code Online (Sandbox Code Playgroud)

好吧,显然我现在遇到了可怕的"Out Of Memory"错误,如果用户连续多次重新加载该页面,那么我必须清理我的代码以缩小图像.我通过实现一个位图类来实现这一点,该类将图像转换为位图并为我缩小位图.现在,我的ImageView显示代码如下所示:

imageView1.setImageBitmap(bitmap1);
Run Code Online (Sandbox Code Playgroud)

那部分工作正常.这是问题:

我将uri路径转换为字符串,然后将其保存在SharedPreference中.这样当用户退出应用程序并稍后返回时,它们自动显示的图像就会显示出来.我像这样转换uri:

...
selectedImageUri = data.getData();
String selectedImagePath;
selectedImagePath = getPath(selectedImageUri);
...
Run Code Online (Sandbox Code Playgroud)

检索SharedPreference字符串的旧方法,将其转换为uri,然后显示它工作正常.(当然,除了Out Of Memory错误)它看起来像这样:

Uri myUri = Uri.parse(selectedImagePath);
imageView1 = setImageURI(myUri);
Run Code Online (Sandbox Code Playgroud)

"selectedImagePath"显然是我从SharedPreference中检索到的String.再次,这工作正常,但如果重新加载太多次将抛出错误.

现在不工作的部分是当我尝试实现新的Bitmap转换时,我可以缩放位图而不会出现内存错误.这是代码:

Uri myUri = Uri.parse(selectedImagePath)
Bitmap bitmap = getThumbnail(myUri);
imageView1.setImageBitmap(bitmap);
Run Code Online (Sandbox Code Playgroud)

这没什么.原始图像选择显示图像正常但当我返回到此屏幕并尝试从SharedPreference解析字符串然后将其转换为位图时,什么都没有显示."getThumbnail"方法的代码直接来自THIS POST --->

如何从Uri获取位图?

这是第三个答案.

有人有主意吗?对不起,超长的帖子,但我宁愿解释我的问题,而不是提供足够的信息.对不起,如果在其他地方得到了回答.我一直在寻找其他问题几个小时,并没有找到解决我的问题的任何东西.

谢谢.

dca*_*bal 10

我想通了,所以这就是我为其他有这个独特问题的人所做的.从库中选择图像并返回意图后,我通过以下代码从该意图中获取数据:

selectedImageUri = data.getData();
Run Code Online (Sandbox Code Playgroud)

然后我通过这个得到了路径:

selectedImagePath = getPath(selectedImageUri);
Run Code Online (Sandbox Code Playgroud)

它调用了这个"getPath"方法:

public String getPath(Uri uri)  
{ 
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    return cursor.getString(idx);
} 
Run Code Online (Sandbox Code Playgroud)

然后我将"selectedImagePath"保存为SharedPreference字符串.

稍后,为了检索该字符串并将其转换回显示图像,我首先检索SharedPreference字符串并将其转换回"selectedImagePath".然后,我在ImageView中设置它像这样:

targetImage = (ImageView)findViewById(R.id.imageView1);
targgetImage.setImageBitmap(decodeSampledBitmapFromResource(selectedImagePath, 200, 200));
Run Code Online (Sandbox Code Playgroud)

它调用了以下方法:

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 = 2;

if (height > reqHeight || width > reqWidth) {
    if (width > height) {
        inSampleSize = Math.round((float)height / (float)reqHeight);
    } else {
        inSampleSize = Math.round((float)width / (float)reqWidth);
    }
}
return inSampleSize;
Run Code Online (Sandbox Code Playgroud)

}

public static Bitmap decodeSampledBitmapFromResource(String resId,
        int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(resId, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeFile(resId, options);
}
Run Code Online (Sandbox Code Playgroud)

执行一项相当简单的任务需要很多代码,但它很有效,所以我很开心并继续前进.希望这将有助于其他需要完成同样事情的人.