Как записать изображение с плавающей точкой в ​​файл? - PullRequest
2 голосов
/ 29 февраля 2020

Используя найденный код здесь , я написал код, в котором хранятся данные изображения, где каждый компонент цвета является значением с плавающей запятой.

// Create a TYPE_FLOAT sample model (specifying how the pixels are stored)
SampleModel sampleModel = new PixelInterleavedSampleModel(DataBuffer.TYPE_FLOAT, options.width, options.height, 4, options.width * 4, new int[]{0,1,2,3});
// ...and data buffer (where the pixels are stored)
DataBufferFloat buffer = new DataBufferFloat(options.width * options.height * 4);

// Wrap it in a writable raster
WritableRaster raster = Raster.createWritableRaster(sampleModel, buffer, null);

// Create a color model compatible with this sample model/raster (TYPE_FLOAT)
// Note that the number of bands must equal the number of color components in the 
// color space (3 for RGB) + 1 extra band if the color model contains alpha 
ColorSpace colorSpace = ColorSpace.getInstance(ColorSpace.CS_sRGB);
ColorModel colorModel = new ComponentColorModel(colorSpace, true, false, Transparency.TRANSLUCENT, DataBuffer.TYPE_FLOAT);

// And finally create an image with this raster
BufferedImage out = new BufferedImage(colorModel, raster, colorModel.isAlphaPremultiplied(), null);
float[] backingImageData = buffer.getData();

FloatBuffer data = /*External Image Data Source...*/;
data.get(backingImageData); //Place data in image

boolean writerFound = ImageIO.write(out, "png", new File("C:\\out.png"));

Однако этот код не выполняется, поскольку ImageIO не удается найти подходящего записывающего устройства для этой пользовательской конфигурации образа (как видно при отладке, где writerFound равно false). Как мне получить ImageIO для успешной записи данных с этим изображением?

1 Ответ

1 голос
/ 04 марта 2020

Чтобы записать изображение, содержащее значения с плавающей запятой, в файл, вам необходимо:

a) Формат, позволяющий хранить значения с плавающей запятой. Большинство графических форматов, в том числе JPEG, PNG или GIF, конечно, нет. Я знаю, что наиболее часто используемый формат файла - это TIFF. Тем не менее, стоит отметить, что TIFF с плавающей точкой не является «базовым» TIFF, поэтому не все программное обеспечение TIFF будет поддерживать такие файлы.

b) Плагин ImageIO, который поддерживает запись TIFF в формате с плавающей запятой. Я думаю, что JAI может работать, и почти наверняка GeoTools работает. Мой собственный плагин поддерживает чтение, но не запись плавающей запятой в данный момент (но создание набора изменений для этого должно быть довольно простым, если вы чувствуете себя авантюрным).

При такой сортировке должно работать следующее (учитывая, что out такое же изображение с плавающей запятой, как в вашем коде):

ImageIO.write(out, "TIFF", new File("C:\\out.tif"));
...