【问题标题】:Load huge image from file从文件中加载巨大的图像
【发布时间】:2016-08-20 15:05:08
【问题描述】:

我正在使用存储在 Environment.getDataDirectory() 中的图片,它们的宽度为 1920,高度为 1080,我想使用以下代码将它们加载到图像视图中:

File imgFile = new File(Environment.getDataDirectory() + "/data/com.My.Package/files/Pictures/Sun.jpg");                
Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
                zoomImage.setImageBitmap(myBitmap);

但在 Android 6.0(Samsung Galaxy S6 Edge)上我得到了这个错误,在 Android 5(HTC One)上它是 工作得很好:

W/OpenGLRenderer:位图太大,无法上传到纹理中(3240x5760,最大值=4096x4096)

现在开始提问: 有没有办法避免这个错误并且没有质量下降(我需要这个质量,因为你可以缩放图像)

【问题讨论】:

    标签: android android-5.0-lollipop android-6.0-marshmallow openglrenderer


    【解决方案1】:

    正如您的错误指出的那样,您的图片太大而无法加载。

    基本上现在您正在将整个图像加载到内存中。

    您必须获得更小的/按比例缩小的位图版本。

    您可以使用 BitmapFactory.Options 轻松做到这一点,

    这里有一个链接,详细介绍了推荐使用的技术:developer.android.com/training/displaying-bitmaps/load-bitmap.html

    【讨论】:

    • 但是我会降低质量吗?为什么它不能在 Android 6 上运行,而在 Android 5 上运行?
    • 图像质量不一定取决于 Android 版本,但也可能因手机而异。您的应用程序甚至无法处理当前位图,因此质量应该是您最不关心的问题。我建议使用不同的样本量进行一些测试。
    • 但是如果没有“高”质量,如果放大,您将看不到任何东西。
    • 我看到上面的尺寸甚至是 3240x5760,太大了。
    • 我不知道确切的错误像素,但我将图像保存为 1920/1080,所以这不会太大
    【解决方案2】:
    【解决方案3】:

    我认为你应该尝试使用Glide 加载它。

    程序非常简单,速度很快,希望不会有任何OOM

    只需在您的 build.gradle 中编译它

     compile 'com.github.bumptech.glide:glide:3.7.0'
    

    然后

    Glide
        .with(this)
        .load(imgFile)
        .into(zoomImage);
    

    就是这样,希望你永远不会再面对OOM,我在我的许多应用程序中都使用过图像,但我从未遇到过OOM

    希望对你有帮助

    【讨论】:

    • 它会看图片吗?
    • 默认情况下会这样做,但如果你不想这样做,你可以简单地添加.diskCacheStrategy(DiskCacheStrategy.NONE),它不会缓存图像
    • 如果我尝试加载图像,它会给我这个错误,stack=java.lang.NoClassDefFoundError: Failed resolution of: Lcom/bumptech/glide/Glide;
    • 我想你用的是eclipse,对吧?你应该尝试干净的构建,重新启动
    • 不,Android Studio
    猜你喜欢
    • 1970-01-01
    • 2014-04-13
    • 2021-01-19
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 2013-04-20
    • 2013-02-02
    • 1970-01-01
    相关资源
    最近更新 更多