21.06.2007

SnTT: Bilder per Agent herunterladen und skalieren auf Linux-Server

>>Author:  Bernd Hort
>>Ort:     Hamburg
        
URL: https://www.assono.de/blog/d6plinks/BHOT-74DMBW

Kategorien: Show-n-Tell Thursday, Lotus Notes, Java, Linux

showntell-w120.png
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

Senden Sie einen Kommentar

Kommentare

:-D:-o:-p:-x:-(:-):-\:angry::cool::cry::emb::grin::huh::laugh::lips::rolleyes:;-)

Tags

Deutsche RSS-Feeds (German)

Custom Button Custom Button

English RSS feeds

Custom Button Custom Button