package org.genedb.smallapps;
import static java.awt.RenderingHints.KEY_ALPHA_INTERPOLATION;
import static java.awt.RenderingHints.KEY_ANTIALIASING;
import static java.awt.RenderingHints.KEY_RENDERING;
import static java.awt.RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY;
import static java.awt.RenderingHints.VALUE_ANTIALIAS_ON;
import static java.awt.RenderingHints.VALUE_RENDER_QUALITY;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.KeyStroke;
public class WebImageGenerator {
// Set your image dimensions here
private static int IMAGE_WIDTH = 136;
private static int IMAGE_HEIGHT = 163;
//private static Color BG = Color.CYAN;
private static Color BG = new Color(0xde, 0xde, 0xde);
private static String fileName;
private static int RADIUS = 4;
public WebImageGenerator(String fileName) {
WebImageGenerator.fileName = fileName;
}
public static void draw(Graphics2D g2d) throws IOException {
BufferedImage dest = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = dest.createGraphics();
BufferedImage in = null;
try {
in = loadCompatibleImage(new URL(fileName));
}
catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
g2.setPaint(BG);
g2.fillRect(0, 0, dest.getWidth(), dest.getHeight());
Map<RenderingHints.Key, Object> hints = new HashMap<RenderingHints.Key, Object>();
hints.put(KEY_ANTIALIASING, VALUE_ANTIALIAS_ON);
hints.put(KEY_ALPHA_INTERPOLATION, VALUE_ALPHA_INTERPOLATION_QUALITY);
hints.put(KEY_RENDERING, VALUE_RENDER_QUALITY);
g2.addRenderingHints(hints);
// Round corners
g2.clip(new RoundRectangle2D.Float(0, 0, in.getWidth(), in.getHeight(), RADIUS, RADIUS));
g2.drawImage(in, 0, 0, null);
g2.setClip(null);
// Apply colour cast -do we want this?
// Reflect and fade
for (int x=0; x < 136; x++) {
for (int y=0; y < 27; y++) {
int pixel = dest.getRGB(x, 136-y);
int r = (pixel & 0xFF0000) >>16;
int g = (pixel & 0xFF00) >>8;
int b = pixel & 0xFF;
float fadeFraction = (y*1.0f/27);
r = (int)((r + fadeFraction * (0xde -r)));
g = (int)((g + fadeFraction * (0xde -g)));
b = (int)((b + fadeFraction * (0xde -b)));
//System.err.println(String.format("x='%d' y='%d' pc='%f' r='%d' g='%d' b='%d'", x,136-y, fadeFraction, r, g, b));
int newVal = (pixel & 0xFF000000) | r << 16 | g << 8 | b;
dest.setRGB(x, y+136, newVal);
}
}
g2d.drawImage(dest, null, 0, 0);
}
public static void main(String[] args) throws IOException{
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JComponent component = new JComponent() {
public void paintComponent(Graphics g) {
try {
draw((Graphics2D) g);
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public Dimension getPreferredSize() {
return new Dimension(IMAGE_WIDTH, IMAGE_HEIGHT);
}
};
frame.add(component);
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
JMenu menu = new JMenu("File");
menu.setMnemonic('F');
menuBar.add(menu);
JMenuItem item = new JMenuItem("Save", 'S');
menu.add(item);
item.setAccelerator(KeyStroke.getKeyStroke("ctrl S"));
item.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
JFileChooser chooser = new JFileChooser();
if (chooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION)
try {
saveImage(component, chooser.getSelectedFile().getPath());
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
frame.pack();
WebImageGenerator gd = new WebImageGenerator(args[0]);
frame.setVisible(true);
}
private static void saveImage(final JComponent comp, String fileName) throws IOException {
Rectangle rect = comp.getBounds();
BufferedImage image = new BufferedImage(rect.width, rect.height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D) image.getGraphics();
g.setColor(Color.WHITE);
g.fill(rect);
g.setColor(Color.BLACK);
comp.paint(g);
String extension = fileName.substring(fileName.lastIndexOf('.') + 1);
ImageIO.write(image, extension, new File(fileName));
g.dispose();
}
private static final GraphicsConfiguration CONFIGURATION =
GraphicsEnvironment.getLocalGraphicsEnvironment().
getDefaultScreenDevice().getDefaultConfiguration();
public static BufferedImage loadCompatibleImage(URL resource)
throws IOException {
BufferedImage image = ImageIO.read(resource);
return toCompatibleImage(image);
}
public static BufferedImage toCompatibleImage(BufferedImage image) {
if (image.getColorModel().equals(CONFIGURATION.getColorModel())) {
return image;
}
BufferedImage compatibleImage = CONFIGURATION.createCompatibleImage(
image.getWidth(), image.getHeight(), image.getTransparency());
Graphics g = compatibleImage.getGraphics();
g.drawImage(image, 0, 0, null);
g.dispose();
return compatibleImage;
}
}
//class AlphaFadeFilter implements BufferedImageOp {
//
// private final int fadeHeight;
//
// public Rectangle2D getBounds2D(BufferedImage src) {
// return new Rectangle(0, 0, src.getWidth(), src.getHeight());
// }
//
// public BufferedImage createCompatibleDestImage(
// BufferedImage src, ColorModel destCM) {
//
// if (destCM == null) {
// destCM = src.getColorModel();
// }
//
// return new BufferedImage(destCM,
// destCM.createCompatibleWritableRaster(
// src.getWidth(), src.getHeight()),
// destCM.isAlphaPremultiplied(), null);
// }
//
// public Point2D getPoint2D(Point2D srcPt,
// Point2D dstPt) {
// return (Point2D) srcPt.clone();
// }
//
// public RenderingHints getRenderingHints() {
// return null;
// }
//
// public AlphaFadeFilter(int fadeHeight) {
// this.fadeHeight = fadeHeight;
// }
//
// @Override
// public BufferedImage filter(BufferedImage src, BufferedImage dst) {
//
// if (dst == null) {
// dst = createCompatibleDestImage(src, null);
// }
//
// int width = src.getWidth();
// int height = src.getHeight();
//
// int[] pixels = new int[width * height];
// getPixels(src, 0, 0, width,
// height, pixels);
// mixColor(pixels, width);
// setPixels(dst, 0, 0, width,
// height, pixels);
// return dst;
// }
//
//
// public int[] getPixels(BufferedImage img,
// int x, int y,
// int w, int h,
// int[] pixels) {
// if (w == 0 || h == 0) {
// return new int[0];
// }
// if (pixels == null) {
// pixels = new int[w * h];
// } else if (pixels.length < w * h) {
// throw new IllegalArgumentException(
// "pixels array must have a length >= w*h");
// }
//
// int imageType = img.getType();
// if (imageType == BufferedImage.TYPE_INT_ARGB ||
// imageType == BufferedImage.TYPE_INT_RGB) {
// Raster raster = img.getRaster();
// return (int[]) raster.getDataElements(x, y, w, h, pixels);
// }
//
// return img.getRGB(x, y, w, h, pixels, 0, w);
// }
//
// public void setPixels(BufferedImage img,
// int x, int y, int w, int h, int[] pixels) {
// if (pixels == null || w == 0 || h == 0) {
// return;
// } else if (pixels.length < w * h) {
// throw new IllegalArgumentException("pixels array must have a length" +
// " >= w*h");
// }
//
// int imageType = img.getType();
// if (imageType == BufferedImage.TYPE_INT_ARGB ||
// imageType == BufferedImage.TYPE_INT_RGB) {
// WritableRaster raster = img.getRaster();
// raster.setDataElements(x, y, w, h, pixels);
// } else {
// // Unmanages the image
// img.setRGB(x, y, w, h, pixels, 0, w);
// }
// }
//
// private void mixColor(int[] inPixels, int width) {
// int row = 0;
// int alpha = 0;
// int maxI = 0;
// for (int i = 0; i < inPixels.length; i++) {
// if (i % width == 0) {
// row++;
// if (row > fadeHeight) {
// System.err.println("Break called");
// maxI = i;
// break;
// }
// int alpha1 = (((fadeHeight - row) * 255 /fadeHeight));
// //alpha1 = alpha1 < 255 ? alpha1 : 255;
// System.err.println("alpha="+alpha1);
// alpha = alpha1 << 24;
// }
// int argb = inPixels[i];
// int rest = argb & 0x00FFFFFF;
// if (rest == 0) {
// rest = 0xFFFFFF;
// }
// inPixels[i] = alpha | rest;
// System.err.println(Integer.toHexString(argb)+" : "+Integer.toHexString(rest)+" : "+Integer.toHexString(inPixels[i]));
// }
// for (int i = maxI; i < inPixels.length; i++) {
// inPixels[i] = 0xFFFFFFFF;
// }
// }
//}