On the Fly Image Creation dengan Java

Java memiliki kemampuan untuk membuat citra (image) langsung dari objek-objek Java. Dengan objek Graphics2D, kita diberi fasilitas semacam kanvas yang bisa digambari bentuk, garis, titik, hingga huruf dengan font dan background yang kita inginkan. Pada kasus kali ini, kita akan mencoba membuat sebuah ImageGenerator yang akan menghasilkan citra PNG ke file.

Masalahnya di sini, objek Graphics maupun Graphics2D tidak dapat di-instansiasi langsung dengan operator new. Ia harus mengambil dari objek lain, biasanya adalah Canvas, atau Frame dari java.awt (Abstract Windowing Toolkit). Akan tetapi bagaimana jika aplikasi kita tidak akan melibatkan framing karena bukan aplikasi desktop? katakanlah aplikasi berbasis web atau servlet? Hehe.. inilah caranya!

diagram

Dari objek BufferedImage yang dapat diinstansiasi layaknya deklarasi sebuah kanvas dengan ukuran panjang kali lebar sekian piksel, kita bisa dapatkan objek Graphics2D yang dapat kita gambari bentuk-bentuk sesuka kita. Setelah selesai, serahkan pada objek ImageIO untuk menulisnya ke bentuk file. Semua method dari ImageIO adalah static sehingga bisa dipanggil kapan saja dan di mana saja tanpa instansiasi. Sayang, Java SDK 1.4.x tidak mendukung penulisan format GIF karena masalah lisensi, tapi mulai Java SDK 5 (code-named Tiger), penulisan format GIF sudah didukung.

Konsepnya secara garis besar seperti yang sudah kujelaskan di atas, contoh implementasi nyatanya di bawah ini (Maaf jika tidak terformat dengan baik, untuk pembacaan yang lebih baik, copy-paste aja ke suatu editor Java):

package galih.image;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;

import javax.imageio.ImageIO;

public class ImageGenerator {
public ImageGenerator() {
try {
File f = new File(“E:/My Documents/test.png”);
createWellCaption( “BDK0020”, f );
}
catch(Exception e) {
e.printStackTrace();
}
}

// returning an outputstream
public OutputStream createWellCaption( String wellName ) throws IOException {
// preparing output stream
OutputStream retval = null;
// preparing the canvas
BufferedImage img = new BufferedImage( 72, 19, BufferedImage.TYPE_3BYTE_BGR);
Graphics2D g = img.createGraphics();

// draw white rectangle
g.setPaint(Color.white);
Rectangle2D.Double rect = new Rectangle2D.Double(0,0,72,19);
g.fill(rect);

/* transparency — ImageIO’s PNG encoder renders as black */
/*
g.setComposite(AlphaComposite.Src);
g.setColor(new Color(0,0,0,0));
g.fillRect(0,0,72,19);
*/

// create circle
Ellipse2D.Double circle = new Ellipse2D.Double(1, 1, 16, 16);

// fill the circle
g.setPaint(new Color(34,24,75));
g.fill(circle);

// draw the string
g.setFont(new Font(“Tahoma”, Font.BOLD, 11));
g.drawString( wellName, 19, 13);

// using ImageIO’s PNG Encoder to write PNG Image
ImageIO.write( img, “png”, retval );

return retval;
}

// i create this method to test the code :p
public void createWellCaption( String wellName, File f ) throws IOException {
// preparing the canvas
BufferedImage img = new BufferedImage( 72, 19, BufferedImage.TYPE_3BYTE_BGR);
Graphics2D g = img.createGraphics();

// draw white rectangle
g.setPaint(Color.white);
Rectangle2D.Double rect = new Rectangle2D.Double(0,0,72,19);
g.fill(rect);

/* transparency — ImageIO’s PNG encoder renders as black */
/*
g.setComposite(AlphaComposite.Src);
g.setColor(new Color(0,0,0,0));
g.fillRect(0,0,72,19);
*/

// create circle
Ellipse2D.Double circle = new Ellipse2D.Double(1, 1, 16, 16);

// fill the circle
g.setPaint(new Color(34,24,75));
g.fill(circle);

// draw the string
g.setFont(new Font(“Tahoma”, Font.BOLD, 11));
g.drawString( wellName, 19, 13);

// using ImageIO’s PNG Encoder to write PNG Image
ImageIO.write( img, “png”, f );
}

public static void main(String[] args) {
// TODO Auto-generated method stub
new ImageGenerator();
}

}

Screenshot hasilnya seperti ini….

BDK

It’s so simple right? Yeah, because of this simplicity, I beleive in Java! (kembali ke.. LAPTOP!)

She’s gone,
Out of my life.
Oh, she’s gone.
I find it so hard to go on.
I really miss that girl, my love.

She’s Gone — Steelheart

By Galih Satriaji

Bookaholic, Workaholic. Chubby. That's me!

6 comments

Leave a comment

Your email address will not be published. Required fields are marked *