| /* |
| * |
| * Copyright (c) 2007, 2018, Oracle and/or its affiliates. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * |
| * - Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * |
| * - Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * |
| * - Neither the name of Oracle nor the names of its |
| * contributors may be used to endorse or promote products derived |
| * from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS |
| * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, |
| * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
| * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
| * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| package java2d.demos.Images; |
| |
| |
| import static java.awt.Color.BLACK; |
| import static java.awt.Color.GREEN; |
| import static java.awt.Color.RED; |
| import static java.awt.Color.WHITE; |
| import java.awt.Font; |
| import java.awt.Graphics2D; |
| import java.awt.Image; |
| import java.awt.geom.GeneralPath; |
| import java.awt.geom.Path2D; |
| import java.awt.image.BufferedImage; |
| import java.io.ByteArrayInputStream; |
| import java.io.ByteArrayOutputStream; |
| import java.io.IOException; |
| import java.util.logging.Level; |
| import java.util.logging.Logger; |
| import java2d.Surface; |
| import javax.imageio.IIOImage; |
| import javax.imageio.ImageIO; |
| import javax.imageio.ImageWriteParam; |
| import javax.imageio.ImageWriter; |
| import javax.imageio.plugins.jpeg.JPEGImageWriteParam; |
| import javax.imageio.stream.ImageOutputStream; |
| |
| |
| /** |
| * Render a filled star & duke into a BufferedImage, save the BufferedImage |
| * as a JPEG, display the BufferedImage, using the decoded JPEG BufferedImage |
| * display the JPEG flipped BufferedImage. |
| */ |
| @SuppressWarnings("serial") |
| public class JPEGFlip extends Surface { |
| |
| private static Image img; |
| |
| public JPEGFlip() { |
| setBackground(WHITE); |
| img = getImage("duke.png"); |
| } |
| |
| @Override |
| public void render(int w, int h, Graphics2D g2) { |
| |
| int hh = h / 2; |
| |
| BufferedImage bi = new BufferedImage(w, hh, BufferedImage.TYPE_INT_RGB); |
| Graphics2D big = bi.createGraphics(); |
| |
| // .. use rendering hints from J2DCanvas .. |
| big.setRenderingHints(g2.getRenderingHints()); |
| |
| big.setBackground(getBackground()); |
| big.clearRect(0, 0, w, hh); |
| |
| big.setColor(GREEN.darker()); |
| GeneralPath p = new GeneralPath(Path2D.WIND_NON_ZERO); |
| p.moveTo(-w / 2.0f, -hh / 8.0f); |
| p.lineTo(+w / 2.0f, -hh / 8.0f); |
| p.lineTo(-w / 4.0f, +hh / 2.0f); |
| p.lineTo(+0.0f, -hh / 2.0f); |
| p.lineTo(+w / 4.0f, +hh / 2.0f); |
| p.closePath(); |
| big.translate(w / 2, hh / 2); |
| big.fill(p); |
| |
| float scale = 0.09f; |
| int iw = (int) (scale * w); |
| int ih = (int) (img.getHeight(null) * iw / img.getWidth(null)); |
| big.drawImage(img, -iw / 2, -ih / 2, iw, ih, this); |
| |
| g2.drawImage(bi, 0, 0, this); |
| g2.setFont(new Font("Dialog", Font.PLAIN, 10)); |
| g2.setColor(BLACK); |
| g2.drawString("BufferedImage", 4, 12); |
| |
| |
| BufferedImage bi1 = null; |
| ImageOutputStream ios = null; |
| // To write the jpeg to a file uncomment the File* lines and |
| // comment out the ByteArray*Stream lines. |
| //FileOutputStream out = null; |
| ByteArrayOutputStream out = null; |
| //FileInputStream in = null; |
| ByteArrayInputStream in = null; |
| try { |
| //File file = new File("images", "test.jpg"); |
| //out = new FileOutputStream(file); |
| out = new ByteArrayOutputStream(); |
| ios = ImageIO.createImageOutputStream(out); |
| ImageWriter encoder = |
| ImageIO.getImageWritersByFormatName("JPEG").next(); |
| JPEGImageWriteParam param = new JPEGImageWriteParam(null); |
| |
| param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); |
| param.setCompressionQuality(1.0f); |
| |
| encoder.setOutput(ios); |
| encoder.write(null, new IIOImage(bi, null, null), param); |
| |
| //in = new FileInputStream(file); |
| in = new ByteArrayInputStream(out.toByteArray()); |
| bi1 = ImageIO.read(in); |
| } catch (Exception ex) { |
| g2.setColor(RED); |
| g2.drawString("Error encoding or decoding the image", 5, hh * 2 - 5); |
| return; |
| } finally { |
| if (ios != null) { |
| try { |
| ios.close(); |
| } catch (IOException ex) { |
| Logger.getLogger(JPEGFlip.class.getName()).log(Level.SEVERE, |
| null, ex); |
| } |
| } |
| if (out != null) { |
| try { |
| out.close(); |
| } catch (IOException ex) { |
| Logger.getLogger(JPEGFlip.class.getName()).log(Level.SEVERE, |
| null, ex); |
| } |
| } |
| if (in != null) { |
| try { |
| in.close(); |
| } catch (IOException ex) { |
| Logger.getLogger(JPEGFlip.class.getName()).log(Level.SEVERE, |
| null, ex); |
| } |
| } |
| } |
| |
| if (bi1 == null) { |
| g2.setColor(RED); |
| g2.drawString("Error reading the image", 5, hh * 2 - 5); |
| return; |
| } |
| |
| g2.drawImage(bi1, w, hh * 2, -w, -hh, null); |
| |
| g2.drawString("JPEGImage Flipped", 4, hh * 2 - 4); |
| g2.drawLine(0, hh, w, hh); |
| } |
| |
| public static void main(String[] s) { |
| createDemoFrame(new JPEGFlip()); |
| } |
| } |