我已经全神贯注地找到解决问题的办法,但似乎无法弄明白。我确定它可能只有1或2条简单的线条,希望有人可以引导我朝着正确的方向前进。
在我的应用中,用户可以点击将打开图库的按钮。一旦他们选择了图像,它就会在我的应用程序中的ImageView中显示该图像。那部分工作得非常好。最初,我只是让它从画廊返回一个uri,我会用这个直接显示:
imageView1.setImageURI(myUri);
嗯,很明显,我现在遇到了可怕的" Out Of Memory"如果用户连续多次重新加载该页面,则会出现错误,因此我不得不清理我的代码以缩小图像。我通过实现一个位图类来实现这一点,该类将图像转换为位图并为我缩小位图。现在,我的ImageView显示代码如下所示:
imageView1.setImageBitmap(bitmap1);
该部分也正常运作。这是问题所在:
我将uri路径转换为字符串,然后将其保存在SharedPreference中。这样,当用户退出应用程序并稍后返回时,他们自动设置的图像会自动显示。我像这样转换uri:
...
selectedImageUri = data.getData();
String selectedImagePath;
selectedImagePath = getPath(selectedImageUri);
...
检索SharedPreference字符串的旧方法,将其转换为uri,然后显示它工作正常。 (当然,除了Out Of Memory错误)它看起来像这样:
Uri myUri = Uri.parse(selectedImagePath);
imageView1 = setImageURI(myUri);
" selectedImagePath"显然是我从SharedPreference中检索到的String。再次,这工作正常,但如果重新加载太多次会抛出错误。
现在不工作的部分是当我尝试实现新的位图转换时,我可以缩放位图而不会出现内存错误。这是代码:
Uri myUri = Uri.parse(selectedImagePath)
Bitmap bitmap = getThumbnail(myUri);
imageView1.setImageBitmap(bitmap);
这没有任何显示。原始图像选择显示图像正常但当我返回到此屏幕并尝试从SharedPreference解析字符串然后将其转换为位图时,什么都没有显示。 " getThumbnail"的代码方法是直接从这个POST --->
How to get Bitmap from an Uri?
这是第三个答案。
有人有什么想法吗?对于这篇超级长的帖子感到抱歉,但我不是在解释我的问题,而是提供足够的信息。对不起,如果在其他地方得到了回答。我几个小时都在寻找其他问题而且没有找到解决我问题的任何问题。
感谢。
答案 0 :(得分:10)
我想通了,所以这就是我为其他有这个独特问题的人所做的。从图库中选择图像并返回意图后,我通过以下代码从该意图中获取数据:
selectedImageUri = data.getData();
然后我通过这个获得了通道:
selectedImagePath = getPath(selectedImageUri);
调用了这个“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);
}
然后我将“selectedImagePath”保存为SharedPreference字符串。
稍后,要检索该字符串并将其转换回显示图像,我首先检索SharedPreference字符串并将其转换回“selectedImagePath”。然后,我将它设置在ImageView中,如下所示:
targetImage = (ImageView)findViewById(R.id.imageView1);
targgetImage.setImageBitmap(decodeSampledBitmapFromResource(selectedImagePath, 200, 200));
调用了以下方法:
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;
}
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);
}
执行一项相当简单的任务需要很多代码,但它很有效,所以我很开心并继续前进。希望这将有助于其他需要完成同样事情的人。