5

我有一个非常大的图像,我只想显示一个显示大小的部分(无缩放),并且该部分应该只是图像的中心。因为图像非常大,我无法将整个图像读入内存然后裁剪它。这是我到目前为止所拥有的,但它会为大图像提供 OutOfMemory。另外我认为 inSampleSize 不适用,因为我想裁剪图像,而不是降低分辨率。

Uri data = getIntent().getData();
InputStream is = getContentResolver().openInputStream(data);
Bitmap bitmap = BitmapFactory.decodeStream(is, null, null);

任何帮助都会很棒?

4

3 回答 3

2

您可以通过 2 个步骤执行此操作:

  1. 使用 inJustDecodeBounds=true 获取位图的大小。

  2. 使用 BitmapRegionDecoder 只解码您想要的部分。

不足之处 ?它仅适用于 API 10(但它已经是大多数......)。

于 2014-05-25T06:40:00.753 回答
1

我同意最简单的方法是将图像分解为许多较小的平铺图像,然后加载适当的图像来制作您想要的图像。

但是,如果您不想这样做,您可能会被迫查看 jpeg 本身的编码。

您可以做的是将标题从文件复制到新文件中,然后仅提取所需的像素以创建新文件。然后重新加载新文件将允许您只拥有要使用的图像的子集,并且所有常规 Java 功能和类都将同样可供您使用。

我知道这不一定是一个优雅或简单的解决方案,但它确实保证您将能够使用您希望能够使用的原始 Java 功能。

于 2010-07-30T02:29:45.773 回答
0

我认为您从错误的方向解决问题。

如果位图已经很大,无法作为单个连续图像加载,为什么要将其存储为单个图像?将其切成瓷砖然后加载中心瓷砖并对其进行操作。

于 2010-07-22T14:26:50.290 回答