我需要从SD卡加载大量大图像(500个.png文件)到我的应用程序。我是否总是要将图像转换为位图并制作位图文件?我不想调整堆大小。 还有另一种方法从SD卡读取图像吗?
答案 0 :(得分:1)
如果您在视图中显示它们,则必须将它们完整地加载到内存中。
你没有提到你的图片会有多大,但是我们在照片库中做的是将SoftReference
列表保存到这些位图中,以便垃圾收集器可以将它们扔掉'不可见(即当显示它们的视图被丢弃时 - 确保实际发生这种情况,例如使用AdapterView
)。将它与这些位图的延迟加载相结合,你应该很好。
答案 1 :(得分:0)
应用中图像的内部表示是位和字节的集合 - 不是任何特定格式的图像(png,bmp等)。
当BitmapFactory加载图像时,图像将转换为此内部表示。
一次加载所有位图通常不是一个好主意,你的内存会快速耗尽......
答案 2 :(得分:0)
如果您的图片尺寸非常大,则必须在加载到ImageView之前调整它们的大小。否则,即使一张图片也很容易造成内存不足问题。我不知道你想要同时显示多少图像以及它们有多大。但我建议你在显示它们之前调整它们的大小。
要调整图片大小并显示图片,您可以使用以下代码:
BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
bitmapOptions.inJustDecodeBounds = true;
BitmapFactory.decodeStream(fileInputStream, null, bitmapOptions);
//reduce the image size
int imageWidth = bitmapOptions.outWidth;
int imageHeight = bitmapOptions.outHeight;
int scale = 1;
while (imageWidth/scale >= screenWidth && imageHeight/scale >= screenHeight) {
imageWidth = imageWidth / 2;
imageHeight = imageHeight / 2;
scale = scale * 2;
}
//decode the image with necessary size
fileInputStream = new FileInputStream(cacheFile);
bitmapOptions.inSampleSize = scale;
bitmapOptions.inJustDecodeBounds = false;
imageBitmap = BitmapFactory.decodeStream(fileInputStream, null, bitmapOptions);
ImageView imageView = (ImageView)this.findViewById(R.id.preview);
imageView.setImageBitmap(imageBitmap);
在我的android项目中,我正在使用这段代码来调整我的高清壁纸以查看它。