New version of the imaging library. ImageGenerator is now an abstract class, extended by ImageIOGeneartor and JimiGenerator

This commit is contained in:
lehni 2004-06-17 09:46:26 +00:00
parent ddbf06f173
commit 1d8560ea28

View file

@ -16,280 +16,173 @@
package helma.image;
import helma.main.Server;
import java.awt.*;
import java.awt.image.*;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
/**
* Factory class for generating Image objects from various sources.
*
*
*/
public class ImageGenerator {
public abstract class ImageGenerator {
protected static ImageGenerator generator = null;
/**
* Creates a new ImageGenerator object.
* @return
*/
public ImageGenerator() {
// nothing to do
public static ImageGenerator getInstance() {
if (generator == null) {
// first see wether an image wrapper class was specified in
// server.properties:
String className = Server.getServer().getProperty("imageGenerator");
Class generatorClass = null;
if (className == null) {
// if no class is defined, try the default ones:
try {
Class.forName("com.sun.jimi.core.Jimi");
// if we're still here, JimiWrapper can be used
className = "helma.image.jimi.JimiGenerator";
} catch (ClassNotFoundException e1) {
try {
Class.forName("javax.imageio.ImageIO");
// if we're still here, ImageIOWrapper can be used
className = "helma.image.imageio.ImageIOGenerator";
} catch (ClassNotFoundException e2) {
}
}
}
// now let's get the generator class and create an instance:
try {
generatorClass = Class.forName(className);
} catch (ClassNotFoundException e) {
throw new RuntimeException(
"The imageGenerator class cannot be found: " + className);
}
try {
generator = (ImageGenerator)generatorClass.newInstance();
} catch (Exception e) {
throw new RuntimeException(
"The ImageGenerator instance could not be created: "
+ className);
}
}
return generator;
}
/**
*
*
* @param w ...
* @param h ...
*
*
* @return ...
*/
public ImageWrapper createPaintableImage(int w, int h) {
public ImageWrapper createImage(int w, int h) {
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics g = img.getGraphics();
ImageWrapper rimg = new SunImageWrapper(img, g, w, h, this);
return rimg;
return new ImageWrapper(img, w, h, this);
}
/**
*
*
* @param src ...
*
*
* @return ...
* @throws IOException
*/
public ImageWrapper createPaintableImage(byte[] src) {
ImageWrapper rimg = null;
Image img1 = Toolkit.getDefaultToolkit().createImage(src);
ImageLoader loader = new ImageLoader(img1);
try {
loader.getDimensions();
int w = loader.getWidth();
int h = loader.getHeight();
Image img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics g = img.getGraphics();
g.drawImage(img1, 0, 0, null);
rimg = new SunImageWrapper(img, g, w, h, this);
} finally {
loader.done();
}
return rimg;
public ImageWrapper createImage(byte[] src) throws IOException {
Image img = read(src);
return img != null ? new ImageWrapper(img, this) : null;
}
/**
*
*
* @param src ...
*
* @param urlString ...
*
* @return ...
*/
public ImageWrapper createImage(byte[] src) {
ImageWrapper rimg = null;
Image img = Toolkit.getDefaultToolkit().createImage(src);
ImageLoader loader = new ImageLoader(img);
try {
loader.getDimensions();
int w = loader.getWidth();
int h = loader.getHeight();
rimg = new SunImageWrapper(img, null, w, h, this);
} finally {
loader.done();
}
return rimg;
}
/**
*
*
* @param urlstring ...
*
* @return ...
*
* @throws MalformedURLException
* @throws IOException
* @throws MalformedURLException ...
*/
public ImageWrapper createPaintableImage(String urlstring)
throws MalformedURLException {
ImageWrapper rimg = null;
URL url = new URL(urlstring);
Image img1 = Toolkit.getDefaultToolkit().createImage(url);
ImageLoader loader = new ImageLoader(img1);
try {
loader.getDimensions();
int w = loader.getWidth();
int h = loader.getHeight();
Image img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics g = img.getGraphics();
g.drawImage(img1, 0, 0, null);
rimg = new SunImageWrapper(img, g, w, h, this);
} finally {
loader.done();
}
return rimg;
public ImageWrapper createImage(String urlString)
throws MalformedURLException, IOException {
Image img = read(new URL(urlString));
return img != null ? new ImageWrapper(img, this) : null;
}
/**
*
*
* @param iw ...
* @param filter ...
*
*
* @return ...
*/
public ImageWrapper createPaintableImage(ImageWrapper iw, ImageFilter filter) {
ImageWrapper rimg = null;
FilteredImageSource fis = new FilteredImageSource(iw.getSource(), filter);
Image img1 = Toolkit.getDefaultToolkit().createImage(fis);
ImageLoader loader = new ImageLoader(img1);
try {
loader.getDimensions();
int w = loader.getWidth();
int h = loader.getHeight();
Image img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
Graphics g = img.getGraphics();
g.drawImage(img1, 0, 0, null);
rimg = new SunImageWrapper(img, g, w, h, this);
} finally {
loader.done();
}
return rimg;
public ImageWrapper createImage(ImageWrapper iw, ImageFilter filter) {
// use the ImagFilterOp wrapper for ImageFilters that works directly
// on BufferedImages. The filtering is much faster like that.
// Attention: needs testing with all the filters!
return createImage(iw, new ImageFilterOp(filter));
// Image img = ImageWaiter.waitForImage(
// Toolkit.getDefaultToolkit().createImage(
// new FilteredImageSource(iw.getSource(), filter)));
// return img != null ? new ImageWrapper(img, this) : null;
}
/**
*
*
* @param filename ...
*
* @param iw ...
* @param imageOp ...
*
* @return ...
*/
public Image createImage(String filename) {
Image img = null;
img = Toolkit.getDefaultToolkit().createImage(filename);
ImageLoader loader = new ImageLoader(img);
loader.getDimensions();
loader.done();
return img;
public ImageWrapper createImage(ImageWrapper iw, BufferedImageOp imageOp) {
Image img = imageOp.filter(iw.getBufferedImage(), null);
return img != null ? new ImageWrapper(img, this) : null;
}
/**
*
*
* @param producer ...
*
* @return ...
* @param file the filename the filename of the image to create
*
* @return the newly created image
* @throws IOException
*/
public Image createImage(ImageProducer producer) {
Image img = null;
img = Toolkit.getDefaultToolkit().createImage(producer);
ImageLoader loader = new ImageLoader(img);
loader.getDimensions();
loader.done();
return img;
public Image read(String filename) throws IOException {
return ImageWaiter.waitForImage(
Toolkit.getDefaultToolkit().createImage(filename)
);
}
class ImageLoader implements ImageObserver {
Image img;
int w;
int h;
boolean waiting;
boolean firstFrameLoaded;
ImageLoader(Image img) {
this.img = img;
waiting = true;
firstFrameLoaded = false;
}
synchronized void getDimensions() {
w = img.getWidth(this);
h = img.getHeight(this);
if ((w == -1) || (h == -1)) {
try {
wait(45000);
} catch (InterruptedException x) {
waiting = false;
return;
} finally {
waiting = false;
}
}
// if width and height haven't been set, throw tantrum
if ((w == -1) || (h == -1)) {
throw new RuntimeException("Error loading image");
}
}
synchronized void done() {
waiting = false;
notifyAll();
}
int getWidth() {
return w;
}
int getHeight() {
return h;
}
public synchronized boolean imageUpdate(Image img, int infoflags, int x, int y,
int width, int height) {
// check if there was an error
if (!waiting || ((infoflags & ERROR) > 0) || ((infoflags & ABORT) > 0)) {
// we either timed out or there was an error.
notifyAll();
return false;
}
if (((infoflags & WIDTH) > 0) || ((infoflags & HEIGHT) > 0)) {
if ((infoflags & WIDTH) > 0) {
w = width;
}
if ((infoflags & HEIGHT) > 0) {
h = height;
}
if ((w > -1) && (h > -1) && firstFrameLoaded) {
notifyAll();
return false;
}
}
if (((infoflags & ALLBITS) > 0) || ((infoflags & FRAMEBITS) > 0)) {
firstFrameLoaded = true;
notifyAll();
return false;
}
return true;
}
/**
* @param url the URL the filename of the image to create
*
* @return the newly created image
* @throws IOException
*/
public Image read(URL url) throws IOException {
return ImageWaiter.waitForImage(
Toolkit.getDefaultToolkit().createImage(url)
);
}
}
/**
* @param src the data of the image to create
*
* @return the newly created image
* @throws IOException
*/
public Image read(byte[] src) throws IOException {
return ImageWaiter.waitForImage(
Toolkit.getDefaultToolkit().createImage(src)
);
}
/**
* Saves the image. Image format is deduced from filename.
*
* @param image
* @param filename
* @param quality
* @param alpha
* @throws IOException
*/
public abstract void write(ImageWrapper wrapper, String filename,
float quality, boolean alpha) throws IOException;
}