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

Java中自底向上存储图像像素的最佳方法

  •  3
  • finnw  · 技术社区  · 15 年前

    我有一个字节数组,表示Windows BMP格式中的一个图像,我希望我的库可以将它作为Java应用程序呈现给Java应用程序。 BufferedImage ,请 没有 复制像素数据。

    主要问题是 Raster 在JDK中,图像像素按从上到下、从左到右的顺序存储,而BMP像素数据则按从下到上、从左到右的顺序存储。如果不对此进行补偿,则生成的图像将垂直翻转。

    最明显的“解决方案”是设置 SampleModel scanlineStride 属性设置为负值并更改带区偏移(或 DataBuffer 的数组偏移量)指向左上角的像素,即数组中最后一行的第一个像素。不幸的是,这不起作用,因为 样板模型 如果给定的是负数,则构造函数将引发异常 环磷酰胺 争论。

    我目前正在努力解决这个问题 环磷酰胺 使用反射将字段设置为负值,但如果可能的话,我希望以更干净、更轻便的方式进行。 有没有其他方法可以欺骗 光栅 样板模型 以自下而上的顺序排列像素,但不破坏封装?或者有图书馆可以把 光栅 样板模型 ,是否按相反顺序显示像素行?

    我希望避免以下方法:

    • 复制整个图像(出于性能原因)。代码必须每秒处理数百个大(gt;=1像素)图像,尽管整个图像必须对应用程序可用,但它通常只能访问图像的一小部分(但很难预测)。
    • 修改 数据缓冲区 要执行坐标转换(这实际上有效,但却是另一个“脏”的解决方案,因为缓冲区不需要知道扫描线/像素布局。)
    • 重新实施 光栅 和/或 样板模型 从头开始的接口(由于实现兼容性检查的方式(至少在Sun JDK中),需要特定的子类 样板模型 所以泛型 BottomUpSampleModel 包装类不起作用。)
    3 回复  |  直到 15 年前
        1
  •  1
  •   finnw    15 年前

    我发现我只能使用一个我命名的新类来实现这个 BottomUpComponentSampleModel . 它延伸 ComponentSampleModel 并否定 scanlineStride 字段(幸运的是, protected 而不是 private )调用超类构造函数之后。所有像素地址计算都可以正常工作,尽管 Raster.createWritableRaster 不会(如果给它一个太小的数组,它可能无法检测),但这不是一个严重的问题。

    这不是必要的 MultiPixelPackedSampleModel SinglePixelPackedSampleModel ,因为他们接受了否定 环磷酰胺 . 它们没有带偏移,但可以通过在 DataBuffer .

        2
  •  0
  •   Omry Yadan    15 年前

    如果让应用程序(或访问层)在访问图像的微小部分(但很难预测)时对其副本进行翻译和翻转,会怎么样?

        3
  •  0
  •   jwenting    15 年前

    更好的是,听起来应用程序不需要实际显示图像? 为什么一开始就想把它翻过来让它在屏幕上看起来正确呢?只需编写逻辑就可以使用您拥有的版本? 也不需要有这样的bufferedimage,直接在数组上工作。