/*
JWildfire - an image and animation processor written in Java
Copyright (C) 1995-2011 Andreas Maschke
This is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser
General Public License as published by the Free Software Foundation; either version 2.1 of the
License, or (at your option) any later version.
This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with this software;
if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jwildfire.io;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JLabel;
import org.jwildfire.image.SimpleHDRImage;
import org.jwildfire.image.SimpleImage;
public class ImageReader {
private Component owner;
public ImageReader(Component pOwner) {
owner = pOwner;
}
public ImageReader() {
owner = new JLabel();
}
public SimpleImage loadImage(String pFilename) throws Exception {
File file = new File(pFilename);
if (!file.exists())
throw new FileNotFoundException(pFilename);
Image fileImg = Toolkit.getDefaultToolkit().createImage(pFilename);
MediaTracker tracker = new MediaTracker(owner);
tracker.addImage(fileImg, 0);
tracker.waitForID(0);
int width = fileImg.getWidth(null);
int height = fileImg.getHeight(null);
BufferedImage bImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = bImg.getGraphics();
g.drawImage(fileImg, 0, 0, null);
fileImg = null;
return new SimpleImage(bImg, width, height);
}
private String readNextLine(InputStream is) throws Exception {
int b, idx = 0;
byte line[] = new byte[256];
while ((b = is.read()) != -1) {
if (b == '\n') {
break;
}
line[idx++] = (byte) b;
}
return idx > 0 ? new String(line, 0, idx) : "";
}
public SimpleHDRImage loadHDRImage(String pFilename) throws Exception {
File file = new File(pFilename);
if (!file.exists())
throw new FileNotFoundException(pFilename);
InputStream f = new BufferedInputStream(new FileInputStream(pFilename));
// header
String header = readNextLine(f);
if (!"#?RGBE".equals(header)) {
throw new IllegalArgumentException("Invalid header <" + header + ">");
}
// format
String format = readNextLine(f);
if (!"FORMAT=32-bit_rle_rgbe".equals(format)) {
throw new IllegalArgumentException("Invalid format <" + format + ">");
}
// skip empty line
readNextLine(f);
// image size
String dimension = readNextLine(f);
Pattern pattern = Pattern.compile("\\-Y ([0-9]+) \\+X ([0-9]+)");
Matcher matcher = pattern.matcher(dimension);
if (!matcher.find()) {
throw new IllegalArgumentException("Invalid dimension identifier<" + dimension + ">");
}
int width = Integer.parseInt(matcher.group(2));
int height = Integer.parseInt(matcher.group(1));
SimpleHDRImage res = new SimpleHDRImage(width, height);
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
int r = f.read();
int g = f.read();
int b = f.read();
int e = f.read();
res.setRGBEValue(j, i, r, g, b, e);
}
}
return res;
}
}