gpt4 book ai didi

java - 在 Java 中以自下而上的顺序存储图像像素的最佳方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:19:39 27 4
gpt4 key购买 nike

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

主要问题是 JDK 中 Raster 的所有实现都以自上而下、从左到右的顺序存储图像像素,而 BMP 像素数据是自下而上、从左到-存储的正确的。如果不对此进行补偿,生成的图像将垂直翻转。

最明显的“解决方案”是将 SampleModelscanlineStride 属性设置为负值并更改波段偏移(或 DataBuffer 的数组偏移量)指向左上角的像素,即数组中最后一行的第一个像素。不幸的是,这不起作用,因为如果给定一个负的 scanlineStride 参数,所有 SampleModel 构造函数都会抛出异常。

我目前正在通过使用反射将 scanlineStride 字段强制设置为负值来解决这个问题,但如果可能的话,我想以一种更干净、更便携的方式来做到这一点。例如有没有另一种方法可以欺骗 RasterSampleModel 以自下而上的顺序排列像素但不破坏封装?或者是否有某个库可以包装 RasterSampleModel,以相反的顺序呈现像素行?

我宁愿避免以下方法:

  • 复制整个图像(出于性能原因。代码必须每秒处理数百个大型(>= 1Mpixels)图像,尽管整个图像必须可供应用程序使用,但它通常只会访问很小的(但很难)预测)图像的一部分。)
  • 修改 DataBuffer 以执行坐标转换(这确实有效,但它是另一个“肮脏”的解决方案,因为缓冲区不需要知道扫描线/像素布局。)
  • 从头开始重新实现 Raster 和/或 SampleModel 接口(interface)(由于兼容性检查的实现方式(至少在 Sun JDK 中),需要特定的子类SampleModel 所以通用的 BottomUpSampleModel 包装类将不起作用。)

最佳答案

我发现我可以只使用一个新类来实现它,我将其命名为 BottomUpComponentSampleModel。它扩展了 ComponentSampleModel 并否定了 scanlineStride 字段的值(幸运的是,它是 protected 而不是 private)在调用父类(super class)构造函数之后。所有像素地址计算工作正常,虽然 Raster.createWritableRaster 中的验证没有(如果给它一个太小的数组,它可能无法检测),但这不是一个严重的问题.

这对于 MultiPixelPackedSampleModelSinglePixelPackedSampleModel 不是必需的,因为它们确实接受负的 scanlineStride。它们没有波段偏移,但这可以通过在 DataBuffer 上设置偏移来解决。

关于java - 在 Java 中以自下而上的顺序存储图像像素的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2461288/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com