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:
- find plugin allow me open .hdr file. i've been searching lot without luck;
- find way convert .hdr file format can find plugin for. tiff maybe? tried still no luck;
- 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
Post a Comment