android - 在 Android 中显示巨大的图像

标签 android image memory view png

我打算在 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

我正在寻找一个简单的解决方案来一次显示 一个大图像,并且能够水平和垂直滚动同时能够放大和缩小。

这是我要显示的图像示例 enter image description here

最佳答案

我知道这是一篇旧帖子,但我在这个问题上花了很多时间,所以这是我的解决方案。

我想显示一张 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/

相关文章:

c# - WPF 中按钮启用和禁用状态的不同图像

java - 在java中,如果我扩展一个类并且在重新定义每个函数时不使用 super 字段,该字段是否仍然使用内存?

java - 尝试使用 Apache POI 写入 excel 文件导致 OutOfMemoryError

java - 将变量从 MainActivity 传递到另一个 Activity 到选项卡 Fragment

java - AcharEngine制作日期相关图表

android - Android Studio 3.0 上的 com.android.dex.DexIndexOverflowException

java - 分配二维数组分配额外内存的问题

javascript - Angular 如何将本地镜像引用到 JSON 对象中

android - 在 Facebook 上分享链接和图片

java - JVM 的内存占用量是多少,如何将其最小化?