我想在drawable dir的imageview中显示图像。我正在解码位图并设置为imageview但不幸的是它给了我一些内存错误。
请帮帮我......
答案 0 :(得分:0)
嘿,你不必将drawable解码为位图。
你可以这样做。imageview.setImageResource(R.drawable.whatever_the_image_is)
希望这有助于你
答案 1 :(得分:0)
Android Training类“Displaying Bitmaps Efficiently”为加载位图时理解和处理异常java.lang.OutOfMemoryError: bitmap size exceeds VM budget
提供了一些很好的信息。
BitmapFactory
类提供了多种解码方法(decodeByteArray()
,decodeFile()
,decodeResource()
等),用于从各种来源创建Bitmap
。根据图像数据源选择最合适的解码方法。这些方法尝试为构造的位图分配内存,因此很容易导致OutOfMemory
异常。每种类型的解码方法都有其他签名,可让您通过BitmapFactory.Options
类指定解码选项。在解码时将inJustDecodeBounds
属性设置为true
可以避免内存分配,为位图对象返回null
,但设置outWidth
,outHeight
和outMimeType
。此技术允许您在构造(和内存分配)位图之前读取图像数据的尺寸和类型。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;
要避免java.lang.OutOfMemory
例外,请在解码之前检查位图的尺寸,除非您完全信任该源为您提供可预测大小的图像数据,这些图像数据可以轻松地放入可用内存中。
现在已知图像尺寸,它们可用于决定是否应将完整图像加载到内存中,或者是否应加载子采样版本。以下是需要考虑的一些因素:
例如,如果将最终显示在ImageView
的128x96像素缩略图中,则不值得将1024x768像素图像加载到内存中。
要告诉解码器对图像进行二次采样,将较小的版本加载到内存中,请在inSampleSize
对象中将true
设置为BitmapFactory.Options
。例如,用inSampleSize
4解码的分辨率为2048x1536的图像产生大约512x384的位图。将其加载到内存中对于完整图像使用0.75MB而不是12MB(假设位图配置为ARGB_8888
)。这是一种根据目标宽度和高度计算样本大小值为2的幂的方法:
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;
}
注意:计算两个幂的幂,因为解码器使用a 最终值通过向下舍入到最接近的2的幂,按照
inSampleSize
文档。
要使用此方法,首先将inJustDecodeBounds
设置为true
进行解码,传递选项,然后使用新的inSampleSize
值再次解码,inJustDecodeBounds
设置为{ {1}}:
false
此方法可以轻松地将任意大尺寸的位图加载到显示100x100像素缩略图的public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// First decode with inJustDecodeBounds=true to check dimensions
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
}
中,如以下示例代码所示:
ImageView
您可以按照类似的过程解码来自其他来源的位图,方法是根据需要替换相应的mImageView.setImageBitmap(
decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100));
方法。
答案 2 :(得分:0)
尝试在清单文件中添加它。
BitmapFactory.decode*
喜欢这个
android:largeHeap="true"
希望这有帮助。