有人知道 BitmapFactory.decodeFile 可以解码的文件大小是否有限制吗?该内容涉及IT技术。

3
我使用以下代码。对于大图片文件,它会返回 null,而小图片则可以正常显示。请问是否有 BitmapFactory.decodeFile 的大小限制?
            File imgFile = new File(path);              
            if(imgFile.exists())
            {       
                Bitmap myBitmap=null;

                myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());                 

                ImageView imageView=(ImageView)findViewById(R.id.imageView1);                                                                                                       
                if(myBitmap!=null) {                    

                    imageView.setImageBitmap(myBitmap);
                }
                else {
                    Toast.makeText(MainActivity.this, "NULL",  Toast.LENGTH_LONG).show();
                }
            } else  Toast.makeText(MainActivity.this, "NO FILE",  Toast.LENGTH_LONG).show();

根据我在文档中看到的内容,不应该有限制。但是有些线程可能需要它们自己的线程,以防止加载时界面卡住。 - undefined
所以这个应该在它自己的线程中运行? - undefined
1
我建议将位图解码发送到AsyncTask。Yazan可能对堆大小是正确的,但我不确定Android在位图解码期间如何处理内存分配,并且图像必须非常大且可能具有高分辨率才会遇到堆问题。 - undefined
在解码时,你应该调整文件的大小。如果它是一个jpg文件(你没有说它是什么类型的文件),那么要将其转换为位图,你很容易需要比原始文件大小多二十倍以上的内存。 - undefined
2个回答

0

它有多大?有多少MB?

因为每个移动应用程序都有特定的内存(堆大小)限制,一个大位图可能会超过这个限制,所以你会得到一个OutOfMemoryException(内存溢出异常),从而得到一个null值。

编辑: 除非这个大位图碰巧是一些奇怪格式的损坏,应用程序无法解码?尝试另一个大位图。


关于3MB的内容。我将它放在了一个try catch块中,没有异常。它并没有损坏,我在其他应用程序中打开并测试了其他文件。在模拟器和三星S4上返回null。 - undefined
根据文档,此方法会“返回解码后的位图,如果无法解码则返回null。” http://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeFile(java.lang.String) - undefined
其他应用是指什么?像电脑应用程序还是移动应用程序?因为有时候你可能在电脑上能打开图片,但在手机上却不行... - undefined
好的,这就是我能想到的全部了。如果我是你,我会找一个相同大小的BMP文件并尝试一下,你需要追踪这个问题,缩小可能性,直到找出原因。 - undefined
有时候我会用一个很好的技巧,只需在msPaint或其他编辑器中打开图像,然后保存它,再在应用程序中重复使用它,清理项目或重命名文件以确保获取更新后的图像,看看你能得到什么。 - undefined
显示剩余2条评论

0
从经验来看,当你达到openGL的分辨率限制时,你会看到以下类型的错误信息:
Bitmap too large to be uploaded into a texture (4128x2322, max=4096x4096)

你可能会遇到OutOfMemoryException错误,就像许多人所指出的那样。

首先,你应该做以下操作:

final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(inputStream, null, options);
final int width = options.outWidth;
final int height = options.outHeight;

现在你已经有了宽度和高度,是时候做一个智能的决定来重新调整它了。
此时,我建议你看一下谷歌提供的完整代码示例(只需复制/粘贴两个方法),点击高效加载大型位图链接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接