Bilder von einer Webcam herunterladen und skalieren mittels eines Lotus
Notes Agents kann ja nicht so schwierig sein. Schließlich gibt es mit Java
Image I/O ein entsprechendes Paket,
dass alles notwendige mitbringt. Nach ein paar Versuchen funktioniert die
Lösung auch in einem Backend-Agent. Zumindest tut sie das auf einem Domino
Server, der unter Windows läuft.
Läuft der Server unter Linux gibt es
eine hässliche Fehlermeldung:
java.lang.NoClassDefFoundError: sun/awt/X11GraphicsEnvironment
Nach ein wenig Recherche war die Ursache
für das Problem gefunden. Java Image I/O verwendet Funktionen des Betriebssystems,
um die Grafiken herunterzuladen und umzuwandeln. Wenn der Server unter
Linux ohne graphische Oberfläche läuft, stehen diese Funktionen aber leider
nicht zur Verfügung.
Die Lösung für dieses Problem heißt
JIMI.
Ursprünglich wurde JIMI entwickelt, um unter Java 1.1.x die Bearbeitung
von Bildern zu ermöglichen. Sun stellt es kostenlos als Download zur Verfügung:
http://java.sun.com/products/jimi/
Nach dem Download muss die Datei JimiProClasses.zip
dem Agenten mittels "Edit Project" zugänglich gemacht werden.
Der Agent gliedert sich nun in drei
Teile.
Zunächst wird mittles des java.net Pakets
das Bild auf die lokale Festplatte heruntergeladen.
int pos = this.urlString.lastIndexOf("/");
String filename = this.urlString.substring(pos
+ 1);
URLConnection con = null;
URL url = new URL(urlString);
con = url.openConnection();
con.setDoOutput(true);
con.setDoInput(true);
con.setRequestProperty("file-name",
filename);
con.setRequestProperty("content-type",
"binary/data");
InputStream in = con.getInputStream();
int count;
byte[] buffer = new byte[8192]; // or more
...
while ((count = in.read(buffer)) > 0)
out.write(buffer,
0, count);
out.close();
out = null;
Anschließend wird mit dem JPEGImageDecoder
eine Image-Objekt erzeugt.
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(new
FileInputStream(filename));
image = decoder.decodeAsBufferedImage();
Der letzte Schritt besteht darin, mittels
JIMI AreaAverageScaleFilter und einem JimiWriter auf der Festplatte die
neue Version zu erzeugen.
FilteredImageSource filteredImage = new FilteredImageSource
(image.getSource (), new AreaAverageScaleFilter (thumbWidth, thumbHeight));
JimiWriter writer = Jimi.createJimiWriter(filePath);
writer.setSource(filteredImage);
JPGOptions options = new JPGOptions();
options.setQuality(75);
writer.setOptions(options);
writer.putImage(filePath);
Weil es doch immer einfacher ist, ein
funktionierendes Beispiel zu sehen, habe ich eine kleine Demo-Datenbank
erstellt.
JIMIDemo.zip