New version of the imaging library. ImageGenerator is now an abstract class, extended by ImageIOGeneartor and JimiGenerator
This commit is contained in:
parent
ddbf06f173
commit
1d8560ea28
1 changed files with 121 additions and 228 deletions
|
@ -16,8 +16,11 @@
|
|||
|
||||
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;
|
||||
|
||||
|
@ -25,271 +28,161 @@ 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);
|
||||
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!
|
||||
|
||||
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;
|
||||
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 file the filename the filename of the image to create
|
||||
*
|
||||
*
|
||||
* @param producer ...
|
||||
*
|
||||
* @return ...
|
||||
* @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;
|
||||
/**
|
||||
* @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)
|
||||
);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
/**
|
||||
* @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)
|
||||
);
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 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;
|
||||
}
|
Loading…
Add table
Reference in a new issue