我有一个字节数组,表示 Windows BMP 格式的图像,我希望我的库将它作为 . 呈现给 Java 应用程序BufferedImage
,而不复制像素数据。
主要问题是 JDK 中的所有实现都Raster
以自上而下、从左到右的顺序存储图像像素,而 BMP 像素数据是自下而上、从左到右存储的。如果不对此进行补偿,则生成的图像将垂直翻转。
最明显的“解决方案”是将SampleModel
'scanlineStride
属性设置为负值,并将带偏移(或DataBuffer
' 数组偏移)更改为指向左上角像素,即数组中最后一行的第一个像素. 不幸的是,这不起作用,因为如果给定负参数,所有SampleModel
构造函数都会抛出异常。scanlineStride
我目前正在通过scanlineStride
使用反射将字段强制为负值来解决它,但如果可能的话,我想以一种更清洁、更便携的方式来解决它。例如,是否有另一种方法可以欺骗Raster
orSampleModel
以自下而上的顺序排列像素但不破坏封装?或者是否有一个库可以包装Raster
and SampleModel
,以相反的顺序呈现像素行?
我宁愿避免以下方法:
- 复制整个图像(出于性能原因。代码必须每秒处理数百个大(> = 1Mpixels)图像,虽然整个图像必须可供应用程序使用,但它通常只能访问一个很小的(但难以预测) )图像的一部分。)
- 修改
DataBuffer
以执行坐标变换(这实际上可行,但这是另一个“肮脏”的解决方案,因为缓冲区不需要了解扫描线/像素布局。) - 从头开始重新实现
Raster
和/或SampleModel
接口(因为兼容性检查的实现方式(至少在 Sun JDK 中),需要特定的子类,SampleModel
因此通用BottomUpSampleModel
包装类不起作用。)