在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/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