在Android中查看大图像的一小部分区域

时间:2011-04-30 11:13:17

标签: android graphics memory-limit

在要点中,这就是我想要做的事情:

我想将5百万像素Image的100x100区域(任意部分)加载到Android Bitmap类中,以便我可以将它绘制到画布元素 就这么简单。多数民众赞成我想做的一切。而已。而已。没什么。听起来很简单。所以,在你脸上露笑之前,请继续阅读。

据我所知,这个问题已被问过一百万次了。我也完成了我的作业,研究它。不幸的是,我从各方面都走到了尽头。也许我需要让我的问题足够清楚。

Android VM允许您分配的堆数量有限制。因此,使用以下功能无法加载大型位图,即使是自己的相机(我拥有Nexus S)也是如此。

BitmapFactory.decodeStream(InputStream is)

是的我可以使用 BitmapFactory.Options 进行缩放,但我应该如何放大呢?

现在我正在尝试设计一个可以平滑地放大/缩小图像的图像查看器。显然,如果我甚至无法加载图像,那是不可能的。

在姜饼中我们有一个新类 BitmapRegionDecoder ,但我正在为Froyo设计我的应用程序。所有这些类都使用 Skia 2D图形库连接到原生api。 Android NDK也无法访问这些api。也许有一种方法可以手动构建Skia并使用它来加载java位图。但我不确定如何?

通过使用 malloc / new 在本机C代码中分配的内存,似乎已经在此应用程序中解决了http://blog.javia.org/how-to-work-around-androids-24-mb-memory-limit/ - https://market.android.com/details?id=image.viewer。但我无法弄清楚如何?

所以让事情更清楚我想要的东西可以放大/缩小图像到全分辨率。如果可能,它应该是平滑的,或者至少可以在一个单独的线程中完成。

如果我需要使用OpenGL,那么请给我一个示例代码。

1 个答案:

答案 0 :(得分:0)

我自己想出来了。 :)

它不是最好的方式,但效果非常好。

我使用Skia图形库在本机代码中创建了位图并访问了其区域的子集。 (这意味着我正在访问私有API,其功能可能很容易打破新的Android版本。)

http://code.google.com/p/skia/

我必须在我的C ++代码中链接此lib并通过JNI访问此功能。