1   package ch.ige.edossier.util;
2   
3   import java.io.ByteArrayInputStream;
4   import java.io.IOException;
5   import java.util.HashMap;
6   import java.util.Map;
7   import org.apache.log4j.Logger;
8   import com.sun.image.codec.jpeg.JPEGCodec;
9   import com.sun.image.codec.jpeg.JPEGDecodeParam;
10  import com.sun.image.codec.jpeg.JPEGImageDecoder;
11  import com.sun.media.jai.codec.MemoryCacheSeekableStream;
12  
13  /**
14   * B32.03 - eDossier-Interceptions - Diplomarbeit an der Software-Schule Schweiz<br>
15   * MUSS-ZIEL [M4] - Detail-Dossier (Pflichtenheft b32.03_PF_eDossier.pdf, Seite 16)<br>
16   * KANN-ZIEL [K6] - Attachement (Pflichtenheft b32.03_PF_eDossier.pdf, Seite 17)<br>
17   * Implementierung der ImageWrite-Klasse für JPEG-Bilder
18   * <p>
19   * Copyright (c) 2004, Eidgenössisches Institut für Geistiges Eigentum
20   * @author    Johannes Lang
21   * @version   $Id: JPEGImageWriter.java,v 1.2 2004/11/01 14:18:27 bouquet Exp $
22   */
23  public class JPEGImageWriter extends ImageWriter
24  {
25    // Attribute für Log4j-Logging
26    private static final Logger LOG = Logger.getLogger( JPEGImageWriter.class );
27  
28    /**
29     * Standard-Konstruktor
30     */
31    public JPEGImageWriter()
32    {}
33  
34    /**
35     * @param outputPath = Pfad der zu Schreibenden JPEG-Datei
36     * @param image byte[] Bild als byte-Array
37     * @return dimensions Map mit den Parameterwerten zum Bild
38     * @throws IOException Unerwarteter IO-Fehler
39     */
40    public Map processImage( String outputPath, byte[] image ) throws IOException
41    {
42      processJPEGImage( image, outputPath );
43      Map dimensions = new HashMap();
44      dimensions.put( "width", String.valueOf( this.imageWidthInPixel ) );
45      dimensions.put( "height", String.valueOf( this.imageHeigthInPixel ) );
46      return dimensions;
47    }
48  
49    /**
50     * Verarbeitet das JPEG-Bild
51     * @param image byte[] Bild als byte-Array
52     * @param path String Pfad des Bildes
53     * @throws IOException Unerwarteter IO-Fehler
54     */
55    private void processJPEGImage( byte[] image, String path ) throws IOException
56    {
57      extractSizeDensityJpeg( new MemoryCacheSeekableStream( new ByteArrayInputStream( image ) ) );
58      writeToFile( image, path );
59      callServlet( path, "jpg" );
60    }
61  
62    /**
63     * Ermittlung der Grössen und der Auflösung aus einem JPEG-Bild
64     * @param memorySeekableStream Stream mit den Bilddaten
65     * @throws IOException Unerwarteter IO-Fehler
66     */
67    private void extractSizeDensityJpeg( MemoryCacheSeekableStream memorySeekableStream ) throws IOException
68    {
69      JPEGImageDecoder jpgDecoder = JPEGCodec.createJPEGDecoder( memorySeekableStream );
70      jpgDecoder.decodeAsBufferedImage();
71      JPEGDecodeParam jpgParam = jpgDecoder.getJPEGDecodeParam();
72      this.imageHeigthInPixel = jpgParam.getHeight();
73      this.imageWidthInPixel = jpgParam.getWidth();
74      try
75      {
76        if( jpgParam.getDensityUnit() == jpgParam.DENSITY_UNIT_DOTS_CM )
77        {
78          this.xDensity = ( int ) ( jpgParam.getXDensity() * this.CONVERSION_DPCM_TO_DPI );
79          this.yDensity = ( int ) ( jpgParam.getYDensity() * this.CONVERSION_DPCM_TO_DPI );
80        }
81        else
82        {
83          this.xDensity = jpgParam.getXDensity();
84          this.yDensity = jpgParam.getYDensity();
85        }
86      }
87      catch( Exception ex )
88      {
89        this.xDensity = 300;
90        this.yDensity = 300;
91        LOG.warn( "Auflösungsdaten des JPEG können nicht gelesen werden: " + ex.getMessage() );
92      }
93    }
94  
95  }
96