【问题标题】:BitmapFactory.decodeFile returns null with a proper fileBitmapFactory.decodeFile 使用正确的文件返回 null
【发布时间】:2015-07-28 14:24:20
【问题描述】:

我正在尝试让简单的decodeFile 工作,但我正在失去理智。

下面的代码返回null,而logcat 说:D/skia﹕ --- decoder->decode returned false Aldo 有时会成功(50 次中有一个)。

try {
        BitmapFactory.Options opt = new BitmapFactory.Options();
        opt.inDither = true;
        opt.inPreferredConfig = Bitmap.Config.ARGB_8888;

        canvasBitmap = BitmapFactory.decodeFile(myFile.getAbsolutePath(), opt);

    } catch (OutOfMemoryError e) {
        Log.d(TAG, "Trace: " + e);

        System.gc();

        try {
            Log.d(TAG, "Trying again");
            canvasBitmap = BitmapFactory.decodeFile(myFile.getAbsolutePath());
        } catch (OutOfMemoryError e2) {
            Log.d(TAG, "Trace: " + e2);
            Log.d(TAG, "Out of memory!!!!!!!");
        }
    }

文件已定义,getAbsolutePath 返回/storage/emulated/0/Pictures/Screenshots/Screenshot_2015-07-28-16-18-56.png

文件基本上是在手机上截取的屏幕截图,可以在图库应用和电脑上正常打开,因此它没有损坏

如果由于某种原因这不起作用,是否有任何带有自己解码器的自定义库?我尝试了几个库,但它们似乎都使用相同的 decodeFile。

我在 nexus 4 上进行测试,所以图像是 760p。

【问题讨论】:

  • 该代码中没有返回任何内容。那么什么是假的呢?
  • Log.d(TAG, "Trace: " + e);。那甚至不会编译。
  • @greenapps 需要从文件中设置位图,Log标签在我这边编译,检查导入。
  • 确实可以编译我现在看到的。但是你会想在那里使用e2 而不是e。但是您的代码中没有任何内容返回错误。请解释。 BitmapFactory.decodeFile 将返回 Bitmap 或 null。但绝不是假的。
  • @greenapps 好的,我知道它应该返回“null”,但是“false”返回是从 logcat 复制的,所以它确实返回“false”。我在互联网上看到返回 false 的唯一原因是 CMYK 色彩空间,但我的屏幕截图不能是 CMYK

标签: android decode bitmapfactory


【解决方案1】:

重试decodeFile() 毫无意义。因为如果没有足够的可用内存来构建位图,decodeFile() 将返回 null。您将不会收到其他警告,然后返回值为 null。所以只需检查null; -

【讨论】:

  • 好的,所以我通过使用 if else 检查位图进行了一个 while 循环来解决它。在失败之前,我已经让 while 循环运行了 50 次。但一定有更好的方法,对吧?最后,应用程序占用了 15mb,由于应用程序的目的,我不能在质量上妥协。有时它仍然会失败,即使尝试了 50 次。
  • 你可以在使用后添加a.canvasBitmap.recycle();15mb ?你的意思是 15MB?
  • 是的15MB,我确实会在代码完成后添加回收,但我还是有点害怕旧设备的兼容性。 Aldo 旧设备的分辨率也较低,因此图像更小。
  • 我认为较小的图像不会是问题。不过更大的图像会。
【解决方案2】:

我通过添加带有if elsewhile 循环解决了这个问题

以下代码:

    BitmapFactory.Options opt = new BitmapFactory.Options();
            opt.inDither = true;
            opt.inPreferredConfig = Bitmap.Config.ARGB_8888;

            int i = 0;
            while (canvasBitmap == null && ++i < 99) {

                System.gc();

                Log.d(TAG, "Trying again: " + i);
                canvasBitmap = BitmapFactory.decodeFile(myFile.getAbsolutePath(), opt);
            }

这似乎效率很低但有效,我也在主线程之外运行它,所以它不会导致任何不响应的行为。

【讨论】:

  • 您的问题到底是什么?这段代码对我来说毫无意义。对于一个文件,您将调用 decodeFile() 最多 40 次,希望它最终会这样做?您应该在它返回 null 后立即停止;
  • while ( canvasBitmap == null &amp;&amp; ++i &lt; 40 ).
猜你喜欢
  • 2016-10-17
  • 2018-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多