Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

Source code: org/apache/batik/ext/awt/image/codec/PNGEncoderTest.java


1   /*
2    * Copyright 1999-2004 The Apache Software Foundation.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  
17  package org.apache.batik.ext.awt.image.codec;
18  
19  import org.apache.batik.test.*;
20  import java.awt.*;
21  import java.awt.geom.*;
22  import java.awt.image.*;
23  import java.io.*;
24  
25  /**
26   * This test validates the PNGEncoder operation. It creates a
27   * BufferedImage, then encodes it with the PNGEncoder, then
28   * decodes it and compares the decoded image with the original one.
29   *
30   * @author <a href="mailto:vhardy@eng.sun.com">Vincent Hardy</a>
31   * @version $Id: PNGEncoderTest.java,v 1.4 2005/04/01 02:28:16 deweese Exp $
32   */
33  public class PNGEncoderTest extends AbstractTest {
34      /**
35       * Error when image cannot be encoded
36       * {0} = trace for the exception which was reported
37       */
38      public static final String ERROR_CANNOT_ENCODE_IMAGE 
39          = "PNGEncoderTest.error.cannot.encode.image";
40  
41      /**
42       * Error when image cannot be decoded
43       * {0} = trace for the exception which was reported
44       */
45      public static final String ERROR_CANNOT_DECODE_IMAGE
46          = "PNGEncoderTest.error.cannot.decode.image";
47  
48      /**
49       * Decoded image differs from encoded image
50       */
51      public static final String ERROR_DECODED_DOES_NOT_MATCH_ENCODED
52          = "PNGEncoderTest.error.decoded.does.not.match.encoded";
53  
54      public TestReport runImpl() throws Exception {
55          // Create a BufferedImage to be encoded
56          BufferedImage image = new BufferedImage(100, 75, BufferedImage.TYPE_INT_ARGB);
57          Graphics2D ig = image.createGraphics();
58          ig.scale(.5, .5);
59          ig.setPaint(new Color(128,0,0));
60          ig.fillRect(0, 0, 100, 50);
61          ig.setPaint(Color.orange);
62          ig.fillRect(100, 0, 100, 50);
63          ig.setPaint(Color.yellow);
64          ig.fillRect(0, 50, 100, 50);
65          ig.setPaint(Color.red);
66          ig.fillRect(100, 50, 100, 50);
67          ig.setPaint(new Color(255, 127, 127));
68          ig.fillRect(0, 100, 100, 50);
69          ig.setPaint(Color.black);
70          ig.draw(new Rectangle2D.Double(0.5, 0.5, 199, 149));
71          ig.dispose();
72  
73          image = image.getSubimage(50, 0, 50, 25); 
74  
75          // Create an output stream where the PNG data
76          // will be stored.
77          ByteArrayOutputStream bos = new ByteArrayOutputStream();
78          OutputStream os = buildOutputStream(bos);
79  
80          // Now, try to encode image
81          PNGEncodeParam params =
82              PNGEncodeParam.getDefaultEncodeParam(image);
83          PNGImageEncoder pngImageEncoder = new PNGImageEncoder(os, params);
84  
85          try{
86              pngImageEncoder.encode(image);
87              os.close();
88          }catch(Exception e){
89              return reportException(ERROR_CANNOT_ENCODE_IMAGE, e);
90          }
91  
92          // Now, try to decode image
93          InputStream is 
94              = buildInputStream(bos);
95  
96          PNGImageDecoder pngImageDecoder 
97              = new PNGImageDecoder(is, new PNGDecodeParam());
98  
99          RenderedImage decodedRenderedImage = null;
100         try{
101             decodedRenderedImage = pngImageDecoder.decodeAsRenderedImage(0);
102         }catch(Exception e){
103             return reportException(ERROR_CANNOT_DECODE_IMAGE,
104                             e);
105         }
106 
107         BufferedImage decodedImage = null;
108         if(decodedRenderedImage instanceof BufferedImage){
109             decodedImage = (BufferedImage)decodedRenderedImage;
110         }
111         else{
112             decodedImage = new BufferedImage(decodedRenderedImage.getWidth(),
113                                              decodedRenderedImage.getHeight(),
114                                              BufferedImage.TYPE_INT_ARGB);
115             ig = decodedImage.createGraphics();
116             ig.drawRenderedImage(decodedRenderedImage, 
117                                  new AffineTransform());
118             ig.dispose();
119         }
120 
121         // Compare images
122         if(checkIdentical(image, decodedImage) != true){
123             return reportError(ERROR_DECODED_DOES_NOT_MATCH_ENCODED);
124         }
125 
126         return reportSuccess();
127     }
128 
129     /**
130      * Template method for building the PNG output stream. This gives a
131      * chance to sub-classes (e.g., Base64PNGEncoderTest) to add an
132      * additional encoding.
133      */
134     public OutputStream buildOutputStream(ByteArrayOutputStream bos){
135         return bos;
136     }
137 
138     /**
139      * Template method for building the PNG input stream. This gives a
140      * chance to sub-classes (e.g., Base64PNGEncoderTest) to add an
141      * additional decoding.
142      */
143     public InputStream buildInputStream(ByteArrayOutputStream bos){
144         return new ByteArrayInputStream(bos.toByteArray());
145     }
146 
147     /**
148      * Compares the data for the two images
149      */
150     public static boolean checkIdentical(BufferedImage imgA,
151                                          BufferedImage imgB){
152         boolean identical = true;
153         if(imgA.getWidth() == imgB.getWidth() 
154            &&
155            imgA.getHeight() == imgB.getHeight()){
156             int w = imgA.getWidth();
157             int h = imgA.getHeight();
158             for(int i=0; i<h; i++){
159                 for(int j=0; j<w; j++){
160                     if(imgA.getRGB(j,i) != imgB.getRGB(j,i)){
161                         identical = false;
162                         break;
163                     }
164                 }
165                 if( !identical ){
166                     break;
167                 }
168             }
169         }
170 
171         return identical;
172     }
173 
174 }