【问题标题】:How can I do image manipulation on a very large BMP?如何在非常大的 BMP 上进行图像处理?
【发布时间】:2010-08-11 15:34:33
【问题描述】:

我正在尝试对一组非常大(几 GB)的 BMP 图像文件进行一些操作(特别是转换为不同类型的切片)。

我不确定我是否理解 BMP 文件格式,但是否有必要将整个文件加载到内存中?我找不到任何不需要在某些时候加载整个文件的 API。 ImageMagick 也无法做到。

Java 是我选择的最佳工具,但包括命令行工具或桌面软件在内的任何其他解决方案都是可以接受的。

【问题讨论】:

  • 您要进行哪些转换?有些可以通过移动窗口完成,因此您不需要全部加载。其他人可能允许流式传输,而有些人可能需要它:)
  • 没什么大不了的,分割成图块,或者转换成更压缩的格式

标签: java image-processing bitmap


【解决方案1】:

基于this,您可以使用它是行列式的这一事实应该是相当明显的。您应该能够读取一行的一部分,存储它,前进到下一行的相同位置并重复,直到完成所需大小的图块。显然,如果您可以一次将一整行的瓦片存储在内存中,那么您可以一次处理多个瓦片。

没有必要一次加载多个文件的标题。标题格式在链接的 Wikipedia 条目中进行了描述。可能值得关注正在使用的任何压缩方案 - 压缩可能会使这项任务变得更加困难(尽管仍然不是不可能):)

【讨论】:

    【解决方案2】:

    不确定 2011 年的这个探索,但 Java 7(可能还有 6)有很好的方法来获得这种乐趣。

    使用 ImageReader 和 ImageReadParam 类,如果需要,它们允许读取源图像的​​任何矩形部分。设置源矩形并读取

    ... // initialization
    
    private javax.imageio.ImageReadParam m_params;
    private javax.imageio.ImageReader m_reader;
    
    ... // reading
    
    m_params.setSourceRegion( readRect );
    BufferedImage rdImg = m_reader.read( i, m_params );
    
    ... // processing/displaying etc
    

    由于 BMP(它也适用于任何标准 Java 图像类型)是非常平面的格式,在 99.99% 的情况下没有任何压缩,因此以这种方式读取它的任何部分都是非常快速的过程,除了产生的 BufferedImage 之外,内存消耗也很低。或者,您甚至可以在后续请求中重用先前的 BufferedImage,并使用相同尺寸的矩形。请参阅 ImageReadParam.setDestination(BufferedImage 目的地)。但我没有测试这个选项。

    我还发现了一个小的阅读错误,即在 Java 运行时库的 BMP 阅读器类实现中。如果有人对此感兴趣,我会展示简单的方法来纠正它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多