1 /* 2 * 3 * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * - Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * - Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * - Neither the name of Oracle nor the names of its 17 * contributors may be used to endorse or promote products derived 18 * from this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 21 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 22 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 package java2d.demos.Images; 33 34 35 import static java.awt.Color.BLACK; 36 import static java.awt.Color.GREEN; 37 import static java.awt.Color.RED; 38 import static java.awt.Color.WHITE; 39 import java.awt.Font; 40 import java.awt.Graphics2D; 41 import java.awt.Image; 42 import java.awt.geom.GeneralPath; 43 import java.awt.geom.Path2D; 44 import java.awt.image.BufferedImage; 45 import java.io.ByteArrayInputStream; 46 import java.io.ByteArrayOutputStream; 47 import java.io.IOException; 48 import java.util.logging.Level; 49 import java.util.logging.Logger; 50 import java2d.Surface; 51 import javax.imageio.IIOImage; 52 import javax.imageio.ImageIO; 53 import javax.imageio.ImageWriteParam; 54 import javax.imageio.ImageWriter; 55 import javax.imageio.plugins.jpeg.JPEGImageWriteParam; 56 import javax.imageio.stream.ImageOutputStream; 57 58 59 /** 60 * Render a filled star & duke into a BufferedImage, save the BufferedImage 61 * as a JPEG, display the BufferedImage, using the decoded JPEG BufferedImage 62 * display the JPEG flipped BufferedImage. 63 */ 64 @SuppressWarnings("serial") 65 public class JPEGFlip extends Surface { 66 67 private static Image img; 68 69 public JPEGFlip() { 70 setBackground(WHITE); 71 img = getImage("duke.png"); 72 } 73 74 @Override 75 public void render(int w, int h, Graphics2D g2) { 76 77 int hh = h / 2; 78 79 BufferedImage bi = new BufferedImage(w, hh, BufferedImage.TYPE_INT_RGB); 80 Graphics2D big = bi.createGraphics(); 81 82 // .. use rendering hints from J2DCanvas .. 83 big.setRenderingHints(g2.getRenderingHints()); 84 85 big.setBackground(getBackground()); 86 big.clearRect(0, 0, w, hh); 87 88 big.setColor(GREEN.darker()); 89 GeneralPath p = new GeneralPath(Path2D.WIND_NON_ZERO); 90 p.moveTo(-w / 2.0f, -hh / 8.0f); 91 p.lineTo(+w / 2.0f, -hh / 8.0f); 92 p.lineTo(-w / 4.0f, +hh / 2.0f); 93 p.lineTo(+0.0f, -hh / 2.0f); 94 p.lineTo(+w / 4.0f, +hh / 2.0f); 95 p.closePath(); 96 big.translate(w / 2, hh / 2); 97 big.fill(p); 98 99 float scale = 0.09f; 100 int iw = (int) (scale * w); 101 int ih = (int) (img.getHeight(null) * iw / img.getWidth(null)); 102 big.drawImage(img, -iw / 2, -ih / 2, iw, ih, this); 103 104 g2.drawImage(bi, 0, 0, this); 105 g2.setFont(new Font("Dialog", Font.PLAIN, 10)); 106 g2.setColor(BLACK); 107 g2.drawString("BufferedImage", 4, 12); 108 109 110 BufferedImage bi1 = null; 111 ImageOutputStream ios = null; 112 // To write the jpeg to a file uncomment the File* lines and 113 // comment out the ByteArray*Stream lines. 114 //FileOutputStream out = null; 115 ByteArrayOutputStream out = null; 116 //FileInputStream in = null; 117 ByteArrayInputStream in = null; 118 try { 119 //File file = new File("images", "test.jpg"); 120 //out = new FileOutputStream(file); 121 out = new ByteArrayOutputStream(); 122 ios = ImageIO.createImageOutputStream(out); 123 ImageWriter encoder = 124 ImageIO.getImageWritersByFormatName("JPEG").next(); 125 JPEGImageWriteParam param = new JPEGImageWriteParam(null); 126 127 param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 128 param.setCompressionQuality(1.0f); 129 130 encoder.setOutput(ios); 131 encoder.write(null, new IIOImage(bi, null, null), param); 132 133 //in = new FileInputStream(file); 134 in = new ByteArrayInputStream(out.toByteArray()); 135 bi1 = ImageIO.read(in); 136 } catch (Exception ex) { 137 g2.setColor(RED); 138 g2.drawString("Error encoding or decoding the image", 5, hh * 2 - 5); 139 return; 140 } finally { 141 if (ios != null) { 142 try { 143 ios.close(); 144 } catch (IOException ex) { 145 Logger.getLogger(JPEGFlip.class.getName()).log(Level.SEVERE, 146 null, ex); 147 } 148 } 149 if (out != null) { 150 try { 151 out.close(); 152 } catch (IOException ex) { 153 Logger.getLogger(JPEGFlip.class.getName()).log(Level.SEVERE, 154 null, ex); 155 } 156 } 157 if (in != null) { 158 try { 159 in.close(); 160 } catch (IOException ex) { 161 Logger.getLogger(JPEGFlip.class.getName()).log(Level.SEVERE, 162 null, ex); 163 } 164 } 165 } 166 167 if (bi1 == null) { 168 g2.setColor(RED); 169 g2.drawString("Error reading the image", 5, hh * 2 - 5); 170 return; 171 } 172 173 g2.drawImage(bi1, w, hh * 2, -w, -hh, null); 174 175 g2.drawString("JPEGImage Flipped", 4, hh * 2 - 4); 176 g2.drawLine(0, hh, w, hh); 177 } 178 179 public static void main(String s[]) { 180 createDemoFrame(new JPEGFlip()); 181 } 182 }