On the Fly Image Creation dengan Java

Posted by: on Jan 26, 2007 | 6 Comments

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

6 Comments

  1. SeaGate
    January 26, 2007

    Blog bagus! Dibanyakin artikel Java-nya ya! Aku sedang seneng2nya belajar Java nih.

    Reply
  2. Nur Aini Rakhmawati
    January 28, 2007

    jadi pengin mrogram java lagi nih ..
    kangen …
    abis gara2 riset in jadi belajar C , TCL dan OTCL

    Reply
  3. arham_kendari
    January 29, 2007

    hiks, gak mudeng, Boz..
    gaptek akut gw mah..
    kapan-kapan ajarin gw dunk.. ;)

    Reply
  4. Galih Satria
    January 29, 2007

    #Bu I’in:
    =)) Makan tuh TCL!!

    #Arham:
    Hehehe… bang Arham, selamat datang! :D

    Reply
  5. d-nial
    January 29, 2007

    Lirik yang di bawah maksute opo?
    skrinsyut juga tah???

    Reply
  6. Galih Satria
    January 29, 2007

    #d-nial: ;) ) bukan… mirip-mirip dengan today’s emotion :p

    Reply

Leave a Reply

Switch to our mobile site