我打算在 Android 中显示非常大的图像。
我的第一个解决方案 - 以 pdf 格式提供它们 - 失败了,因为并非每台手持设备都预装了 pdf-viewer,而且我不想要求用户安装一个.
所以我现在有一个我想要显示的 png (width = 3998px height=2827px)。我下载了这张图片来测试它在画廊中的显示方式。这很痛苦。好像图片库只渲染了一次,放大的话根本看不懂文字。
所以我写了一个 testActivity,它只是有一个嵌套在 LinearLayout 中的 ImageView。我将图像放入drawable并将其设置为ImageView的图像源。
不幸的是,由于“
ERROR/AndroidRuntime(8906): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget"
我没想到 ONE 单个图像对于VM 的内存
来说可能太大了。我玩了一下,将 ImageViews
大小设置为 3998 & 2827px
,将图像放入 sdCard
并使用 手动读取文件输入流
.
令我大吃一惊的是,它现在显示了我的图像,但如果我将 Nexus S 水平 我得到与以前相同的 OutOfMemoryError
。
有人可以指出我通过 FileInputStream
接收位图或将其设置为 ImageView's
源之间的主要区别。
此外,我无法舒适地滚动两个父 scrollViews
我正在寻找一个简单的解决方案来一次显示 一个大图像
,并且能够水平和垂直滚动
同时能够放大和缩小。
这是我要显示的图像示例
最佳答案
我知道这是一篇旧帖子,但我在这个问题上花了很多时间,所以这是我的解决方案。
我想显示一张 2000×3000 的图片,但内存不足或图片太大而无法显示。
首先,我得到图片的尺寸:
o = new BitmapFactory.Options();
o.inJustDecodeBounds=true;
pictures = BitmapFactory.decodeStream(new FileInputStream(f), null, o);
然后我把它分成四个部分,并用四个 ImageView 显示它们。
我尝试加载整张图片并将其切成四份(使用 BitmapFactory.create(bitmap,int,int,int,int)
),但又内存不足。
所以我决定使用一些 BitMapRegionDecoder:
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
ImageView iv = new ImageView(this);
InputStream istream = null;
try {
istream = this.getContentResolver().openInputStream(Uri.fromFile(f));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
BitmapRegionDecoder decoder = null;
try {
decoder = BitmapRegionDecoder.newInstance(istream, false);
} catch (IOException e) {
e.printStackTrace();
}
int nw = (j*width/k);
int nh = (i*height/k);
Bitmap bMap = decoder.decodeRegion(new Rect(nw,nh, (nw+width/k),(nh+height/k)), null);
iv.setImageBitmap(bMap);
}
}
这行得通。
关于android - 在 Android 中显示巨大的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6518215/