Mega Code Archive

 
Categories / Java / 2D Graphics GUI
 

Effects

import java.awt.AlphaComposite; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import java.awt.geom.Ellipse2D; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; import javax.swing.JFrame; import com.sun.image.codec.jpeg.ImageFormatException; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageDecoder; public class ShowOff extends Component {   public static void main(String[] args) {     try {       String filename = "largerntsoftLogo.jpg";       String message = "Java Source and Support";       int split = 4;       JFrame f = new JFrame();       f.getContentPane().setLayout(new BorderLayout());       ShowOff showOff = new ShowOff(filename, message, split);       f.add(showOff, BorderLayout.CENTER);       f.setSize(f.getPreferredSize());       f.setResizable(false);       f.setVisible(true);     } catch (Exception e) {       System.out.println(e);       System.exit(0);     }   }   private BufferedImage mImage;   private Font mFont;   private String mMessage;   private int mSplit;   private TextLayout mLayout;   public ShowOff(String filename, String message, int split)       throws IOException, ImageFormatException {     InputStream in = getClass().getResourceAsStream(filename);     JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(in);     mImage = decoder.decodeAsBufferedImage();     in.close();     mFont = new Font("Serif", Font.PLAIN, 116);     mMessage = message;     mSplit = split;     setSize((int) mImage.getWidth(), (int) mImage.getHeight());   }   public void paint(Graphics g) {     Graphics2D g2 = (Graphics2D) g;     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,         RenderingHints.VALUE_ANTIALIAS_ON);     drawBackground(g2);     drawImageMosaic(g2);     drawText(g2);   }   protected void drawBackground(Graphics2D g2) {     int side = 45;     int width = getSize().width;     int height = getSize().height;     Color[] colors = { Color.yellow, Color.cyan, Color.orange, Color.pink,         Color.magenta, Color.lightGray };     for (int y = 0; y < height; y += side) {       for (int x = 0; x < width; x += side) {         Ellipse2D ellipse = new Ellipse2D.Float(x, y, side, side);         int index = (x + y) / side % colors.length;         g2.setPaint(colors[index]);         g2.fill(ellipse);       }     }   }   protected void drawImageMosaic(Graphics2D g2) {     int side = 36;     int width = mImage.getWidth();     int height = mImage.getHeight();     for (int y = 0; y < height; y += side) {       for (int x = 0; x < width; x += side) {         float xBias = (float) x / (float) width;         float yBias = (float) y / (float) height;         float alpha = 1.0f - Math.abs(xBias - yBias);         g2.setComposite(AlphaComposite.getInstance(             AlphaComposite.SRC_OVER, alpha));         int w = Math.min(side, width - x);         int h = Math.min(side, height - y);         BufferedImage tile = mImage.getSubimage(x, y, w, h);         g2.drawImage(tile, x, y, null);       }     }     g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));   }   protected void drawText(Graphics2D g2) {     FontRenderContext frc = g2.getFontRenderContext();     mLayout = new TextLayout(mMessage, mFont, frc);     int width = getSize().width;     int height = getSize().height;     Rectangle2D bounds = mLayout.getBounds();     double x = (width - bounds.getWidth()) / 2;     double y = height - bounds.getHeight();     drawString(g2, x, y, 0);     drawString(g2, width - bounds.getHeight(), y, -Math.PI / 2);   }   protected void drawString(Graphics2D g2, double x, double y, double theta) {     g2.translate(x, y);     g2.rotate(theta);     String first = mMessage.substring(0, mSplit);     float width = drawBoxedString(g2, first, Color.white, Color.red, 0);     String second = mMessage.substring(mSplit);     drawBoxedString(g2, second, Color.blue, Color.white, width);     g2.rotate(-theta);     g2.translate(-x, -y);   }   protected float drawBoxedString(Graphics2D g2, String s, Color c1,       Color c2, double x) {     FontRenderContext frc = g2.getFontRenderContext();     TextLayout subLayout = new TextLayout(s, mFont, frc);     float advance = subLayout.getAdvance();     GradientPaint gradient = new GradientPaint((float) x, 0, c1,         (float) (x + advance), 0, c2);     g2.setPaint(gradient);     Rectangle2D bounds = mLayout.getBounds();     Rectangle2D back = new Rectangle2D.Double(x, 0, advance, bounds         .getHeight());     g2.fill(back);     g2.setPaint(Color.white);     g2.setFont(mFont);     g2.drawString(s, (float) x, (float) -bounds.getY());     return advance;   } }