在Android中显示巨大的图像

我打算在Android中显示非常大的图像。

我的第一个解决scheme – 以pdf的forms提供 – 没有成功,因为并不是每个手持设备都预装了pdf查看器,而且我也不想要求用户安装。

所以我现在有一个PNG (宽= 3998px高= 2827px) ,我想要显示。 我下载了这个图像来testing它将如何显示在画廊上。 这是相当痛苦的。 看来这个画面只能渲染一次,如果我放大,我根本看不懂。

所以我写了一个testActivity,它只是一个embedded在LinearLayout中的ImageView。 我把图像放入drawable中,并将其设置为ImageView的图像源。 不幸的是,应用程序立即崩溃,由于“

ERROR/AndroidRuntime(8906): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget" 

我没想到,单个镜像对于VM's memory可能太大了。 我玩了一下,把ImageViews大小设置为3998 & 2827px ,把Image放到sdCard ,用fileInputStream手动读取。
令我大吃一惊的是,它现在显示了我的图像,但是如果我将Nexus S水平翻转,我会得到和以前一样的OutOfMemoryError

有些人可能会指出通过FileInputStream接收Bitmap或将其设置为ImageView's源代码之间的主要区别。

此外,我不能够舒适地与两个父scrollViews

我寻找一个简单的解决scheme,一次显示ONE large image ,能够scroll horizontal and vertical同时可以放大和缩小。

这里是我想要显示的图像的示例 在这里输入图像描述

我知道这是一个旧的post,但我花了很多时间在这个问题上,所以这是我的解决scheme。

我想显示一个2000×3000的图片,但我内存不足或图像太大,无法显示。

首先,我得到了图片的尺寸:

 o = new BitmapFactory.Options(); o.inJustDecodeBounds=true; pictures = BitmapFactory.decodeStream(new FileInputStream(f), null, o); 

然后我把它分成四个部分,并用四个ImageViews显示它们。 我试图加载完整的图片,并把它切成四(使用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); } } 

这工作。

我知道它的一个老问题,但我用TileView来做到这一点:

https://github.com/moagrius/TileView

尝试使用这一个: https : //github.com/davemorrissey/subsampling-scale-image-view

适用于Android的自定义图像视图,专为照片库和显示巨大图像(例如地图和build筑平面图)而devise,无OutOfMemoryErrors。 包括缩放,平移,旋转和animation支持,并允许轻松扩展,所以你可以添加自己的覆盖和触摸事件检测。

您可以使用WorldMap应用程序的“易于整合”来源:

https://github.com/johnnylambada/WorldMap

这使用世界地图的巨大图像,并使用caching来显示地图。

为了整合,我只复制了所有的java文件(5我猜),并在我的布局文件中使用了surfaceView。 然后,我通过ImageViewerActivity.java的小OnCreate()方法,并在我的活动中使用代码(根据我个人的使用情况进行小小的修改)。

这篇文章是使用多点触摸手势缩放图片的一个很好的演示。 它使用matrix来缩放以及平移图片。

这个答案应该解决它u 当加载图像到Bitmap对象时,出现内存不足的问题

要处理缩放等,并使用全分辨率,您可以使用OSM的MapView(打开街道地图),并提供您的瓷砖(而不是地图)。 检查这个: http : //www.haakseth.com/?p=30

我们必须遵循以下步骤来加载巨大的图像时删除内存不足exception:

  1. Read Bitmap Dimensions and Type 2. Load a Scaled down version into memory 

Android开发人员指南定义了我们如何实现这些。 链接在这里

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html#load-bitmap