Image offline rendering :: Java/2D Graphics GUI/Buffer Paint [SSISO Community]

SSISO Community (Source & API)

Java
 Animation (4)  Area Calculation  Buffer Paint (3)  Chart (2)
 Clip  Color Model  Color  Composite
 Curve  Font  Full Screen  Geometry
 GIF  Gradient Paint (3)  Graphic Environment  Icon
 Image Filter  Image IO  Image  JAI
Image offline rendering
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.InputStream;

import javax.swing.JFrame;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageDecoder;

public class ImageDuplicity extends Component {
  private BufferedImage image;

  public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    if (image == null)
      createOffscreenImage();
    g2.drawImage(image, 0, 0, this);
  }

  private void createOffscreenImage() {
    Dimension d = getSize();
    int width = d.width; 
    int height = d.height;
    image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

    Graphics2D g2 = image.createGraphics();
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);

    try {
      String filename = "largeJava2sLogo.jpg";
      InputStream in = getClass().getResourceAsStream(filename);
      JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(in);
      BufferedImage image = decoder.decodeAsBufferedImage();
      in.close();
      g2.drawImage(image, 0, 0, width, height, null);
    } catch (Exception e) {
      System.out.print(e);
    }

    g2.setStroke(new BasicStroke(2));
    Color[] colors = { Color.red, Color.blue, Color.green };
    for (int i = -32; i < 40; i += 8) {
      g2.setPaint(colors[Math.abs(i) % 3]);
      g2.drawOval(i, i, width - i * 2, height - i * 2);
    }
  }
  public static void main(String[] args) {
    JFrame f = new JFrame();
    f.setLayout(new BorderLayout());
    Component c = new ImageDuplicity();
    f.add(c, BorderLayout.CENTER);
    f.setSize(200, 250);
    f.setVisible(true);
  }
}
Buffered draw without flicker
Smooth move using double buffer
Image offline rendering