java - imageIO to open .HDR file -


i need open .hdr file , work on it, imageio doesn't supports format.

the problem need keep information loss little possible: 32bpc perfect, 16 fine , less 16 won't work.

there 3 possible solutions came to:

  1. find plugin allow me open .hdr file. i've been searching lot without luck;
  2. find way convert .hdr file format can find plugin for. tiff maybe? tried still no luck;
  3. reduce dynamic range 32bpc 16bpc , convert png. tricky because once have png file win, it's not easy cut range without killing image..

what recommend me do? know way make 1 of 3 options works? or have better idea?

you can read .hdr using imageio. :-)

this first version, might little rough around edges, should work standard (default settings) radiance rgbe .hdr files. you'll have download , build project sources now, i'll hope make release soon.

the returned image custom bufferedimage databufferfloat backing (ie., samples in 3 samples, 32-bit float interleaved rgb format).

by default, simple global tone-mapping applied, , rgb values normalized range [0...1] (this allows use imageio.read(hdrfile) , image reasonable, in reasonable time).

it possible pass hdrimagereadparam imagereader instance nulltonemapper. faster, float values unnormalized, , might exceed max value. allows custom, more sophisticated tone-mapping on image data, before converting more displayable.

something like:

// create input stream imageinputstream input = imageio.createimageinputstream(hdrfile);  try {     // 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 image, using settings param         bufferedimage image = reader.read(0, param);     }     {         // dispose reader in block avoid memory leaks         reader.dispose();     } } {     // close stream in block avoid resource leaks     input.close(); }  // float data float[] rgb = ((databufferfloat) image.getraster().getdatabuffer()).getdata();  // todo: custom tone mapping on float rgb data  // convert image displayable bufferedimage converted = new colorconvertop(null).filter(image, new bufferedimage(image.getwidth(), image.getheight(), bufferedimage.type_int_rgb));  // optionally write jpeg or other format imageio.write(converted, "jpeg", new file(...)); 

Comments

Popular posts from this blog

Android : Making Listview full screen -

javascript - Parse JSON from the body of the POST -

javascript - Chrome Extension: Interacting with iframe embedded within popup -