View Javadoc

1   // Copyright 2000-2007 FreeHEP
2   package org.freehep.graphicsio.pdf;
3   
4   import org.freehep.graphicsio.ImageConstants;
5   import org.freehep.graphicsio.ImageGraphics2D;
6   
7   import java.awt.image.RenderedImage;
8   import java.awt.Color;
9   import java.io.IOException;
10  
11  /**
12   * PDF writes images as ZLIB or JPEG. This class converts an image to a
13   * byte[]. If neither {@link ImageConstants#ZLIB} nor
14   * {@link ImageConstants#JPEG} is passed the smallest size is stored
15   * for {@link #getBytes()}. The method {@link #getFormat()} returns the
16   * used format.
17   *
18   * @author Steffen Greiffenberg
19   * @version $Revision$
20   */
21  class ImageBytes {
22  
23      /**
24       * Used format during creation of bytes
25       */
26      private String format;
27  
28      /**
29       * Bytes in given format
30       */
31      private byte[] bytes;
32  
33      /**
34       * Encodes the passed image
35       *
36       * @param image image to convert
37       * @param bkg background color
38       * @param format format could be {@link ImageConstants#ZLIB} or {@link ImageConstants#JPEG}
39       * @param colorModel e.g. {@link org.freehep.graphicsio.ImageConstants#COLOR_MODEL_RGB}
40       * @throws IOException thrown by {@link org.freehep.graphicsio.ImageGraphics2D#toByteArray(java.awt.image.RenderedImage, String, String, java.util.Properties)}
41       */
42      public ImageBytes(RenderedImage image, Color bkg, String format, String colorModel) throws IOException {
43  
44          // ZLIB encoding, transparent images allways require ZLIB
45          if (ImageConstants.ZLIB.equals(format) || (image.getColorModel().hasAlpha() && (bkg == null))) {
46              bytes = toZLIB(image, bkg, colorModel);
47              this.format = ImageConstants.ZLIB;
48          }
49  
50          // JPG encoding
51          else  if (ImageConstants.JPEG.equals(format)) {
52              bytes = toJPG(image);
53              this.format = ImageConstants.JPG;
54          } else {
55              // calculate both byte arrays
56              byte[] jpgBytes = toJPG(image);
57              byte[] zlibBytes = toZLIB(image, bkg, colorModel);
58  
59              // compare sizes to determine smalles format
60              if (jpgBytes.length < 0.5 * zlibBytes.length) {
61                  bytes = jpgBytes;
62                  this.format = ImageConstants.JPG;
63              } else {
64                  bytes = zlibBytes;
65                  this.format = ImageConstants.ZLIB;
66              }
67          }
68      }
69  
70      /**
71       * Creates the ZLIB Bytes for PDF images
72       *
73       * @param image image to convert
74       * @param bkg background color
75       * @param colorModel e.g. {@link org.freehep.graphicsio.ImageConstants#COLOR_MODEL_RGB}
76       * @return bytes
77       * @throws IOException thrown by {@link org.freehep.graphicsio.ImageGraphics2D#toByteArray(java.awt.image.RenderedImage, String, String, java.util.Properties)}
78       */
79      private byte[] toZLIB(RenderedImage image, Color bkg, String colorModel) throws IOException {
80          return ImageGraphics2D.toByteArray(
81              image,
82              ImageConstants.RAW,
83              ImageConstants.ENCODING_FLATE_ASCII85,
84              ImageGraphics2D.getRAWProperties(bkg, colorModel));
85      }
86  
87      /**
88       * Creates the JPG bytes for PDF images
89       *
90       * @param image image to convert
91       * @return bytes
92       * @throws IOException thrown by {@link org.freehep.graphicsio.ImageGraphics2D#toByteArray(java.awt.image.RenderedImage, String, String, java.util.Properties)}
93       */
94      private byte[] toJPG(RenderedImage image) throws IOException {
95          return ImageGraphics2D.toByteArray(
96              image,
97              ImageConstants.JPG,
98              ImageConstants.ENCODING_ASCII85,
99              null);
100     }
101 
102     /**
103      * @return bytes
104      */
105     public byte[] getBytes() {
106         return bytes;
107     }
108 
109     /**
110      * @return used encoding format
111      */
112     public String getFormat() {
113         return format;
114     }
115 }
116 /**
117  * $Log$
118  */