2015-07-14 2 views
0

Мне нужно открыть .hdr-файл и поработать над ним, но imageIO не поддерживает этот формат.imageIO открыть файл .HDR

Проблема в том, что мне нужно как можно меньше сохранить информацию: 32bpc совершенен, 16 в порядке и меньше 16 не будет работать.

Есть 3 возможных решений я пришел к:

  1. Найти плагин, который позволит мне открыть .HDR файл. Я много искал, но не повезло;
  2. Найти способ конвертировать .HDR-файл в формат, в котором я могу найти плагин. Может быть, Тифф? Пробовал это тоже, но все равно не повезло;
  3. Уменьшите динамический диапазон от 32bpc до 16bpc, а затем преобразуйте его в png. Это сложно, потому что, как только у меня есть файл png, я выигрываю, но это не так просто сократить диапазон, не убивая изображение.

Что бы вы посоветовали мне сделать? Знаете ли вы способ сделать один из этих трех вариантов? Или у вас есть идея лучше?

+0

Если вы можете преобразовать изображение .HDR к RGB 16 или 32 бит/образец TIFF, есть несколько плагинов, которые позволяют чтение, что, например, ([TwelveMonkeys] HTTP : //haraldk.github.io/TwelveMonkeys/). Есть ли спецификация формата .HDR? Если это так, кто-то потенциально может создать плагин ImageIO для него. ;-) – haraldK

+0

К сожалению, проблема заключается именно в преобразовании образа .HDR в 16-битный RGB-файл. Если бы у меня был 16-бит. ПНГ, проблем не было бы. Мне просто нужно преобразовать .HDR в нечто другое, но я не знаю, как это сделать :( – pedro

ответ

1

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(...)); 
+0

Я просто случайно заметил ваше сообщение (без уведомления из stackoverflow). Это выглядит действительно здорово! Вы, вероятно, спасли меня, как недели случайного просмотра интернетом в поисках решения :) Большое спасибо! P.s. Есть ли плагин Jar для добавления в путь или мне нужно скопировать классы, которые находятся на странице вашего проекта github? – pedro

+0

@pedro Странная вещь с уведомлением. Я думаю, у вас должен быть один, но я думаю, что у SO также могут быть ошибки ...;-) В любом случае, да, скоро появятся JAR (и ссылки для загрузки на главной странице), когда я получу время для выхода 3.2. До тех пор вам нужно будет проверить из git, а затем построить вручную. См. Раздел [«Строительство»] (http://haraldk.github.io/TwelveMonkeys/#building) на главной странице. – haraldK

+0

@pedro PS: Дайте мне знать, если у вас есть проблемы с чтением ваших HDR-файлов. У меня только очень ограниченный набор тестовых файлов для тестирования. – haraldK