2 Aralık 2007 Pazar

Resimleri Yönetmek ve Görüntülemek

BufferedImage ile Immediate-Mode Görüntüleme

Immediate-mode görüntüleme modeli, verisi hafızada saklanan piksel haritalı görüntüleri yönetme ve gösterme imkanı saglar.Görüntü verisine birçok formatta erişebilirsiniz ve veriyi işlemek için birkaç tip filtreleme işlemi kullanabilirsiniz

BufferedImage,immediate-mode görüntüleme API sinin anahtar sınıfıdır. Bu sınıf, hafızadaki bir görüntüyü yönetir ve depolama,çevirme ve piksel verisini render

işlemleri için yöntemler saglar. BufferedImage Graphics ve ya Graphics2D render araçlarıyla da görüntülenebilir.

BufferedImage, erişilebilir veri bufferı ile birlikte olan bir görüntüdür.

ColorModel resmin piksel verisi ile bir renk çevrimini saglar. Raster görünütünün

koordinatlarını verir ve görüntü verisini hafızada saklar ayrıca tek bir resim verisinden çoklu alt resimler yaratma mekanizması sunar. Raster ayrıca resimdeki belirli piksellere erişim metodları da saglar.

BufferedImage i Filtreleme

Java 2D API, BufferedImage nesneleri için birkaç filtreleme işlemi tanımlar. Herbir resim-işleme işlemi BufferedImageOp arayüzünü dahil eden bir sınıfın içine gömülüdür. Resim yönetimi, resim işleme filtre metodunda yapılır. Java 2D API

destegindeki BufferedImageOp sınıfları;

  • Affine çevrimi
  • Amplitude ölçekleme
  • Arama tablosu degişikligi
  • Grupların sayısal kombinasyonları
  • Renk dönüştürme
  • Katlama

Resim işleme sınıflarını kullanarak bir BufferedImage ı filtrelemek için şunları

yapabilirsiniz.

  1. BufferedImageOp sınıflarından birinin örnegini oluşturun.

AffineTransformOp, BandCombineOp, ColorConvertOp, ConvolveOp, LookupOp, or RescaleOp.

  1. Resim işlemleri filtreleme metodunu çagırın, filtrelemek istedigniz ve sonuçları depolamak istediginiz BufferedImage a geçin.

Örnek: ImageOps

Aşagıdaki applet 4 resim filtreleme işemini gösterir: low-pass, sharpen, lookup, and rescale.

Keskinleştirici filtre bir ConvolveOp kullanılarak işlendi. Dönüştürme, resimdeki herbir piksel ve komsu piksellerin degerlerini artırarak yapıldı.

BufferedImage a , keskinleştirici filtreyi uygulayın, bu örnek aşagıdaki koda benzer bir koddur.

public static final float[] SHARPEN3x3 
= {
                            0.f, -1.f, 0.f,
                            -1.f, 5.0f, -1.f,
                            0.f, -1.f, 0.f};
BufferedImage dstbimg = new 
              
BufferedImage(iw,ih,BufferedImage.TYPE_INT_RGB);
Kernel kernel = new Kernel(3,3,SHARPEN3x3);
ConvolveOp cop = new ConvolveOp(kernel,
                         
       ConvolveOp.EDGE_NO_OP,
                                null);
cop.filter(srcbimg,dstbimg);

Kernel nesnesi , immediate alanındaki pikseller tarafından etkileşen herbir çıktı pikseli matematiksel olarak tanımlar. Kernel in tanımlaması, filtreleme sonuçlarını belirler.

Double Buffering için bir BufferedImage Kullanma

Bir grafik karmaşıksa ve ya tekrar kullanılıyorsa , ilk olarak onu bir off-screen buffer a render lamayla ve buffer ı ekrana kopyalarak, görüntülemek için harcanan zamanı kısaltabilirsiniz. Bu teknige “double buffering” denir ve animasyonlarda sıklıkla kullanılır.

Bir BufferedImage kolaylıkla bir off-screen buffer gibi kullanılabilir. Renk alanı, derinligi ve piksel haritası çizim yaptıgınız pencereye tam olarak oturan bir BufferedImage yaratmak için, Component createImage methodunu çagırın. Off-screen görüntünün tipini ve ya transparanlıgını kontrol etmek isterseniz, direk olarak bir BufferImage oluşturabilir ve onu bir off-screen buffer gibi kullanabilirsiniz.

BufferdeImage a çizim yapmak için , BufferedImage createGraphics m

etodunu çagırıp bir Graphicd2D nesnesi oluşturabilirsiniz; bundan sonra Graphics2D deki uygun renderlama metodlarını çagırabilirsiniz,

BufferedImage ı ekrana kopyalamaya hazır oldugunuzda basitçe bileşenlerinizin Graphics2D sindeki drawImage ı çagırabilir ve BufferedImage a geçebilirsiniz.

Örnek: BufferedShapeMover

Aşagıdaki applet , kullanıcıya applet penceresinde bir dikdörtgen çizme olanıgı saglar. Dikdörtgeni, her fare yerinde kullanıcının ihtiyaç duydugu feedback i saglamak için renderlama yerine , bir bufferedImage bir off-screen buffer gibi kullanılmıştır. Dikdörtgen çizildiginde , bufferedImage daki her bir noktanın ekrana uyması için , bufferedImage a tekrar renderlanmıştır

public void updateLocation(MouseEvent e){
    rect.setLocation(last_x + e.getX(),
                     last_y + e.getY());
    ...
    repaint();
    ...
    // In the update method...
    if(firstTime) {
        Dimension dim = getSize();
        int w = dim.width;
        int h = dim.height;
        area = new Rectangle(dim);
        bi = (BufferedImage)createImage(w, h);
        big = bi.createGraphics();
        rect.setLocation(w/2-50, h/2-25);
        big.setStroke(new BasicStroke(8.0f));
        firstTime = false;
    }
 
    // Clears the rectangle that was previously drawn.
    big.setColor(Color.white);
    big.clearRect(0, 0, area.width, area.height);
 
    // Draws and fills the newly positioned rectangle
    // to the buffer.
    big.setPaint(strokePolka);
    big.draw(rect);
    big.setPaint(fillPolka);
    big.fill(rect);
 
    // Draws the buffered image to the screen.
    g2.drawImage(bi, 0, 0, this);
 
}
 


Hiç yorum yok: