www.Gerhard-Raabe.de
  Java Package
 
 
Back   Grafik
 
Copyright: Das nachfolgenden Packages ist frei verfügbar, solange es nicht kommerziell verwendet wird! Falls es so wie veröffentlicht, in Teilen oder abgewandelt zum Einsatz kommt, würde ich mich sehr über eine kurze E-Mail freuen.
 
Package-Name: Grafik
Grafik.GIFEncoder
 
Enthaltende Klassen: Grafik.CExportGrafikDialog
Grafik.CExportGrafikPreview

Grafik.GIFEncoder.CBitFile
Grafik.GIFEncoder.CBitUtils
Grafik.GIFEncoder.CGIFEncoder
Grafik.GIFEncoder.CImageDescriptor
Grafik.GIFEncoder.CLZWCompressor
Grafik.GIFEncoder.CLZWStringTable
Grafik.GIFEncoder.CScreenDescriptor
 
Anwendung: Das Package enthält einen Dialog der den Export von Image-Objekt in die folgenden Formate ermöglicht :
  • GIF
  • PNG
  • JPG
Der Dialog enthält eine Auswahlmöglichkeit für das gewünschte Grafik-Format sowie ein Preview des übergebenen Image-Object. Bei Auswahl des JPG-Formats wird ein Slider aktiviert, mit dem die Kompressionsqualität angegeben werden kann (in Prozent). Darüber hinaus kann das Image-Object vor dem Export noch über eine Prozent-Angabe (oder im Preview mit der Mouse) in der Größe verändert werden.

Nach betätigen des Export-Buttons wird über ein File-Auswahldialog das Export-File bestimmt und das Image entsprechend der Auswahl exportiert.

Darüberhinaus wird in dem Package Grafik.GIFEncoder eine Klassenbibliothek für den GIF-Export bereitgestellt.
 
Beschreibung: Der Dialog CExportGrafikDialog:

CExportGrafikDialog


Export PNG:

Das Java-Package javax.imageio ermöglicht den einfachen Export von Image-Objekten:

        .
      .
      .
Image l_Image = ...
      .
      .
      .
try
{
      File l_File = new File("FileName");
      ImageIO.load((BufferedImage)l_Image), File("png", l_File);
}
catch (IOException i)
{
      JOptionPane.showMessageDialog(this, i.getMessage(), "IO-Error",
            JOptionPane.ERROR_MESSAGE);
            .
            .
            .
}
      .
      .
      .
 


Export JPG:

Zum JPG-Export stellt Java das Package Paket com.sun.image.codec.jpeg zur Verfügung:

        .
      .
      .
Image l_Image = ...
      .
      .
      .
try
{
      // Create ByteArrayOutputStream
      ByteArrayOutputStream l_ByteArrayOutputStream = new ByteArrayOutputStream();

      // Create Encoder
      JPEGImageEncoder l_JPEGImageEncoder =
            JPEGCodec.createJPEGEncoder(l_ByteArrayOutputStream);

      // Set Encode Parameter for Quality (0.5 = 50%)
      JPEGEncodeParam l_JPEGEncodeParam =
            l_JPEGImageEncoder.getDefaultJPEGEncodeParam((BufferedImage)l_Image);
      l_JPEGEncodeParam.setQuality(0.5, true);

      // Encode Image
      l_JPEGImageEncoder.encode((BufferedImage)l_Image, l_JPEGEncodeParam);

      // Create ByteArrayOutputStream
      FileOutputStream l_FileOutputStream = new FileOutputStream("FileName");
      l_FileOutputStream.write(l_ByteArrayOutputStream.toByteArray());
      l_FileOutputStream.close();
      l_ByteArrayOutputStream.close();
}
catch (IOException i)
{
      JOptionPane.showMessageDialog(this, i.getMessage(), "IO-Error",
            JOptionPane.ERROR_MESSAGE);
            .
            .
            .
}
      .
      .
      .
 

Um mit JPEG-Bildern arbeiten zu können, wird ein Decoder benötigt. Dazu liefert die Methode JPEGCodec.createJPEGEncoder() ein JPEGImageEncoder-Objekt. JPEGImageEncoder selbst ist eine Schnittstelle, die JPEG-Dateien liest oder im Fall von JPEG ImageDecoder schreibt. Dazu verwendet die Klasse intern einen Datenpuffer, der vom Typ BufferedImage sein muss. BufferedImage ist eine Erweiterung der Image-Klasse. Transparenz ist für die Bilder nicht erlaubt. Mit einem konkreten Objekt können dann die Image-Daten geschrieben werden. Dafür wird nur ein beliebiges OutputStream-Objekt benötig.

JPEG-Bilder sind im Gegensatz zu GIF-Bildern verlustkomprimiert. Diese Verluste lassen sich jedoch klein halten. Über eine diskrete Kosinustransformation werden 8 x 8 große Pixelblöcke vereinfacht. Die Komprimierung nutzt die Unfähigkeit des Auges aus, Farbunterschiede so stark wahrzunehmen wie Helligkeitsunterschiede. So können Punkte, die eine ähnliche Helligkeit, aber eine andere Farbe besitzen, zu einem Wert werden. Bei einer hohen Kompression treten so genannte Artefakte (engl. degradation) auf, die unschön wirken. Bei einer sehr hohen Kompression ist das Bild sehr klein (aber auch hässlich).

Um die Qualität des Bilds einzustellen, wird eine Schnittstelle JPEGEncodeParam eingeführt. Das Encoder-Objekt bietet die Methode getDefaultJPEGEncodeParam() an, mit der wir an die Standardparameter kommen. Das Einstellen der Qualität geht über die Methode setQuality(qualiy, true).

Der Qualitätsfaktor ist ein Float und kann sich zwischen 0 und 1 bewegen. 1 bedeutet im Prinzip keine Kompression und somit höchste Qualität. Ein Wert um 0,75 ist ein hoher Wert für Qualitätsbilder, der Wert 0,5 für mittlere Bilder und 0,25 für stärkere Artefakte und hohe Kompression.


Export GIF:

Der GIF-Export wird von Java aus lizenzrechtlichen Gründen nicht unterstützt! Jedoch findet sich unter unter http://www.gurge.com/amd/old/java/GIFEncoder/index.html ein von Adam Doppelt geschriebener GIF-Encoder. Dieser wird an dieser Stelle im Package Grafik.GIFEncoder in leicht modifizierter Form verwendet:

        .
      .
      .
Image l_Image = ...
      .
      .
      .
try
{
      // Create GIF-Encoder
      CGIFEncoder l_GIFEncoder = new CGIFEncoder(l_Image);

      // Create Output-Stream
      OutputStream l_OutputStream = new BufferedOutputStream(
             new FileOutputStream("FileName"));

      // Save as GIF
      l_GIFEncoder.Write(l_OutputStream);
      l_OutputStream.close();
}
catch (IOException i)
{
      JOptionPane.showMessageDialog(this, i.getMessage(), "IO-Error",
            JOptionPane.ERROR_MESSAGE);
            .
            .
            .
}
catch (AWTException i)
{
      JOptionPane.showMessageDialog(this, i.getMessage(), "AWT-Error",
            JOptionPane.ERROR_MESSAGE);
            .
            .
            .
}
      .
      .
      .
 

 
Methoden: Der Dialogs CExportGrafikDialog:

Der Dialog CExportGrafikDialog wird mittels des folgenden Konstruktors initalisiert und gestartet:

  public CExportGrafikDialog(Frame owner, String Titel, Image image)  


Der GIF-Encoder:

Der GIF-Encoder besitzt zwei Konstruktoren, wobei entweder ein geladenes Image-Objekt gesichert werden kann oder drei Felder mit den RGB-Werten:

  public CGIFEncoder(Image Img)  
  public CGIFEncoder(byte R[][], byte G[][], byte B[][])  

Über die Write-Funktion der Klasse wird die Datei dann in einen Ausgabestrom geschrieben. Dieser sollte gepuffert sein, da die Kodierung ohnehin schon lange genug dauert.

  public void Write(OutputStream output)  

 
Beispiel: Ein Beispiel für den GIF-Encioder findet sich im Abschnitt Beschreibung/Export GIF. Der Aufruf und Nutzung des Export-Dialog ist simpel:

        .
      .
      .
Image l_Image = ...
      .
      .
      .
CExportGrafikDialog l_ExportGrafikDialog = new CExportGrafikDialog(this, "Titel", l_Image);
l_ExportGrafikDialog.show();
      .
      .
      .
 

 
Download:
Next   *.class
Next
  *.java
389064 Besucher - seit dem 01.02.2005 - 1 Besucher online © 2004-2015 by Gerhard Raabe ##, ## ### #### - ##:##:##