/*
*
* 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) {
/**代码未完, 请加载全部代码(NowJava.com).**/