You can now read .HDR using ImageIO. :-)
Это первая версия, поэтому она может быть немного грубой по краям, но должна работать для стандартных (настройки по умолчанию) Radiance RGBE .HDR
файлов. На данный момент вам придется загружать и строить проект из источников, но я надеюсь скоро выпустить релиз.
Возвращенное изображение будет пользовательские BufferedImage
с DataBufferFloat
каркасного (то есть., Образцы будут в 3-х образцах, 32-битных float
чередование формата RGB).
По умолчанию применяется простое глобальное отображение тонов, и все значения RGB будут нормированы на диапазон [0 ... 1] (это позволяет любому просто использовать ImageIO.read(hdrFile)
, и изображение будет выглядеть несколько разумным, в очень разумное время).
Также можно передать HDRImageReadParam
экземпляру ImageReader
с кодом NullToneMapper
. Это еще быстрее, но значения float
будут ненормированы и могут превышать максимальное значение. Это позволяет вам делать пользовательские, более сложные тональные сопоставления данных изображения, прежде чем перейти к чему-то более отображаемому.
Что-то вроде:
// Create input stream
ImageInputStream input = ImageIO.createImageInputStream(hdrFile);
try {
// Get the reader
Iterator<ImageReader> readers = ImageIO.getImageReaders(input);
if (!readers.hasNext()) {
throw new IllegalArgumentException("No reader for: " + hdrFile);
}
ImageReader reader = readers.next();
try {
reader.setInput(input);
// Disable default tone mapping
HDRImageReadParam param = (HDRImageReadParam) reader.getDefaultReadParam();
param.setToneMapper(new NullToneMapper());
// Read the image, using settings from param
BufferedImage image = reader.read(0, param);
}
finally {
// Dispose reader in finally block to avoid memory leaks
reader.dispose();
}
}
finally {
// Close stream in finally block to avoid resource leaks
input.close();
}
// Get float data
float[] rgb = ((DataBufferFloat) image.getRaster().getDataBuffer()).getData();
// TODO: Custom tone mapping on float RGB data
// Convert the image to something easily displayable
BufferedImage converted = new ColorConvertOp(null).filter(image, new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB));
// Optionally write as JPEG or other format
ImageIO.write(converted, "JPEG", new File(...));
Если вы можете преобразовать изображение .HDR к RGB 16 или 32 бит/образец TIFF, есть несколько плагинов, которые позволяют чтение, что, например, ([TwelveMonkeys] HTTP : //haraldk.github.io/TwelveMonkeys/). Есть ли спецификация формата .HDR? Если это так, кто-то потенциально может создать плагин ImageIO для него. ;-) – haraldK
К сожалению, проблема заключается именно в преобразовании образа .HDR в 16-битный RGB-файл. Если бы у меня был 16-бит. ПНГ, проблем не было бы. Мне просто нужно преобразовать .HDR в нечто другое, но я не знаю, как это сделать :( – pedro