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.
BufferedImageOpsınıflarından birinin örnegini oluşturun.
AffineTransformOp, BandCombineOp, ColorConvertOp, ConvolveOp, LookupOp, or RescaleOp.
- 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:
Yorum Gönder