Java ImageIO: Как я могу прочитать BufferedImage из файла, чтобы он использовал DataBufferFloat? - PullRequest
1 голос
/ 17 февраля 2010

Мне нужно прочитать BufferedImage из файла, который не использует DataBufferInt (как обычно), но DataBufferFloat.

Обратите внимание: Мне нужен не просто отдельный DataBufferFloat, а действительно BufferedImage с базовым DataBufferFloat.

API вокруг этих вещей очень сложный, я просто не могу найти, как это сделать.

Пожалуйста, помогите.


EDIT
Выяснил, что не работает:

DataBufferDouble dbd = new DataBufferDouble(destWidth * destHeight * 4);

// Exception here:
// java.lang.IllegalArgumentException: Unsupported data type 5
WritableRaster wr = WritableRaster.createPackedRaster(
    dbd, destWidth, destHeight, 32, new Point(0, 0));

BufferedImage bi = new BufferedImage(ColorModel.getRGBdefault(),
    wr, false, (Hashtable<?, ?>) null);

1 Ответ

0 голосов
/ 17 марта 2010

createPackedRaster не подходит для этого. Он создает Raster с SinglePixelPackedSampleModel, в котором значения r / g / b / a хранятся в битовых полях внутри int, поэтому его transferType может быть только целочисленным типом.

Возможно, вам нужен общий растр с PixelInterleavedSampleModel, например,

DataBufferDouble dbd = new DataBufferDouble(destWidth * destHeight * 4);

SampleModel sm = new PixelInterleavedSampleModel(DataBuffer.TYPE_DOUBLE, destWidth, destHeight, 4, destWidth * 4, new int[] {2, 1, 0, 3});

WritableRaster wr = WritableRaster.createWritableRaster(sm, dbd, null);

ColorModel cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB), true, true, ColorModel.TRANSLUCENT, DataBuffer.TYPE_FLOAT);

BufferedImage bi = new BufferedImage(cm, wr, true, new Hashtable<Object, Object>());
...