代码之家  ›  专栏  ›  技术社区  ›  timothyjc

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

  •  5
  • timothyjc  · 技术社区  · 14 年前

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

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

    有什么帮助吗?

    3 回复  |  直到 10 年前
        1
  •  1
  •   bpescatore    14 年前

    我同意最简单的方法是将图像分解成许多较小的平铺图像,并只加载适当的图像以生成所需的图像。

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

    您可以做的是沿着将文件头文件复制到新文件中,然后提取您想要的像素以创建新文件这一行进行操作。然后重新加载新文件将允许您只拥有您要处理的图像的子集,并且所有常规的Java功能和类都将同样可用以供您使用。

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

        2
  •  2
  •   android developer    10 年前

    您可以通过两个步骤完成此操作:

    1. 通过使用INbasTDecodebounds=true获取位图的大小。

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

    不利的一面?它只适用于API 10(但它已经是大多数…)。

        3
  •  0
  •   j flemm    14 年前

    我认为你是从错误的方向来解决问题的。

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