2010-06-29 48 views
4

我想在Android中显示从SD卡实际像素尺寸中读取的位图。在Android中显示任何尺寸的位图

我不能假设任何关于位图的东西,除了Android支持它的图像格式。位图可能很大。

看起来很简单,但是当您考虑Android内存限制时,它变得更加复杂。

任何想法?

编辑:试图加载大位图会导致内存不足错误,因为Android无法分配足够的内存来解码它。您可以加载缩小版的位图,但这对于以实际像素大小显示位图没有用处。问题是如何在Android上显示大的位图,同时保持在应用程序的内存限制内(很可能是通过将其加载到块中)。

编辑2:位图可能很大,但在合理范围内。我正在谈论用户图像,而不是高清NAS图片。

+0

你试过了吗? – user225626 2010-06-29 18:41:58

+0

广泛地说,是的。 – hpique 2010-06-29 18:46:52

+0

那么,试过究竟是什么?你试图加载一个大的位图,它根本没有显示,甚至最小化? – user225626 2010-06-29 18:54:35

回答

1

由于android 2.3(姜饼,API等级10),您可以使用BitmapRegionDecoder。我不知道任何老版本的Android解决方案。 (我一直在为我的电子邮件相册应用程序寻找它)

3

即使您的设备具有更多可用内存,托管代码(Java)的内存限制为16/24/32MB。我目前正在研究一个需要这样做的应用程序,解决方案是在本机代码(NDK)中分配位图,然后将图像的视图渲染到显示大小的Java分配位图中。在本机代码中,您可以分配设备的所有可用内存,但由于某种原因,虚拟机会限制它。

+0

你能分享一个例子吗? – rahul 2011-04-29 08:25:14

+0

在您的C代码中,您将使用malloc()为大位图分配内存。在Java方面,您将创建一个窗口大小的位图对象。您必须编写自己的bitblit例程以将大型位图的可见部分复制到窗口大小的位图中。您可以通过从您的C代码(Android 2.2+)调用AndroidBitmap_lockPixels()来获取指向Java位图的位的指针。除了这些细节,开始侵犯我的专有工作。 – BitBank 2011-04-30 21:15:58

+0

哦!我不需要写我自己的bitblit例程。我使用了android中已有的skia lib。 – rahul 2011-05-01 15:51:43