在Android中显示巨大的图像

Raf*_*l T 29 memory png android image view

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

我的第一个解决方案 - 以pdf格式提供它们 - 失败了,因为并非所有掌上电脑都预装了pdf-viewer,我不想要求用户安装一个.

所以我现在要显示一个png (宽度= 3998px高度= 2827px).我下载了这张图片来测试它将如何显示在图库中.这真是太痛苦了.似乎galery只渲染了这张照片一次,如果我放大,我根本无法读取文字.

所以我写了一个testActivity,它只是一个嵌套在LinearLayout中的ImageView.我将图像放入drawable并将其设置为ImageView的图像源.不幸的是,应用程序立即崩溃,因为"

 ERROR/AndroidRuntime(8906): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget"  
Run Code Online (Sandbox Code Playgroud)

我没想到一张图片可能太大了VM's memory.我玩了一下,设置ImageViews尺寸3998 & 2827px,把图像放到sdCard手动读取它fileInputStream.
令我惊讶的是,它现在显示了我的图像,但如果我将Nexus S水平转动,我会OutOfMemoryError像以前一样.

有人能指出通过a接收位图FileInputStream或将其设置为ImageView's源之间的主要区别.

此外,我无法滚动舒适的双亲,scrollViews

我搜索一个简单的解决方案,一次显示ONE large image,scroll horizontal and vertical同时能够放大和缩小.

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

lea*_*eep 29

我知道这是一个老帖子,但我花了很多时间来解决这个问题,所以这是我的解决方案.

我想要显示一张2000×3000的图片,但是内存不足或者图像太大而无法显示.

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

o = new BitmapFactory.Options();
o.inJustDecodeBounds=true;
pictures = BitmapFactory.decodeStream(new FileInputStream(f), null, o);
Run Code Online (Sandbox Code Playgroud)

然后我将其分为四个部分,并用四个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);

    }
}
Run Code Online (Sandbox Code Playgroud)

这很有效.

  • 什么是**k**在这里?希望**宽度**和**高度**表示实际图像尺寸.请澄清一下. (2认同)
  • 在这里,我将我的图片分为4个部分,因此k = 2 (2认同)

小智 7

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

https://github.com/moagrius/TileView


小智 7

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

适用于Android的自定义图像视图,专为照片库而设计,无需OutOfMemoryErrors即可显示巨大的图像(例如地图和建筑平面图).包括缩放,平移,旋转和动画支持,并允许轻松扩展,以便您可以添加自己的叠加和触摸事件检测.