裁剪位图首先不读取整个位图

时间:2010-07-21 15:29:34

标签: java android bitmap crop

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

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

任何帮助都会很棒?

3 个答案:

答案 0 :(得分:2)

您可以分两步完成:

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

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

  3. 缺点?它仅适用于API 10(但它已经占多数......)。

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

我认为你是从错误的方向接近问题。

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