İçindekilerGirişİndex
YukarıİlkÖnceki YokSonrakiSon
Geriİleri
Yazdır
Raşit Fidan
fidanras79@yahoo.com

Midletler için Özel imaj manager Class'ı

Raşit Fidan

Şimdi anlatacağım konu resimlerle çalışmak için bir class.Örneğin elinizde bir resim var ve siz Sprite classında olduğu gibi parçalara bölmek istiyorsunuz. Böldüğünüz parçaları döndürüp başka başka imajlar elde etmeyi istiyorsunuz. "Neden bunu isteyeyim ki?" diyorsanız, döndürülmüş imajları, parçalanmış imajları kendiniz editörlerde hazırlayıp çizebilirsiniz.Biz isteyenler için anlatalım.

Bu class şunları yapmaktadır;bir resmi verilen açıda döndürmek,resmi parçalara bölüp dizi halinde sunmak.Dizi halinde veya tek tek verilen resimleri birleştirmek.

ImageManager.javaİndir Göster Gizle Kopar Satır Gizle Satır Göster
  1 import javax.microedition.lcdui.*;
  2 public class ImageManager {
  3   public final static int ROT_90=5;
  4   public final static int ROT_180=2;
  5   public final static int ROT_270=6;
  6   public final static int ROT_NONE=1;
  7   public ImageManager(){}
  8   public Image getRotation(Image img,int angle){
  9     Image tempI=Image.createImage(img.getWidth(),img.getHeight());
 10     Graphics graph=tempI.getGraphics();
 11     graph.drawRegion(img,0,0,img.getWidth(),img.getHeight(),angle,0,0,Graphics.TOP|Graphics.LEFT);
 12     return tempI;
 13   }
 14   public Image[] getRotations(Image img,int row,int col,int angle){
 15     Image[] splittedImgs=splitImage(img,row,col);
 16     Image[] rotatedImgs=new Image[splittedImgs.length];
 17     for(int i=0;i<row;i++){
 18           for(int j=0;j<col;j++){
 19             rotatedImgs[i*j+j]=getRotation(splittedImgs[i*j+j],angle);
 20           }
 21         }
 22     return rotatedImgs;
 23   }
 24   public Image[] splitImage(Image img,int rows,int cols){
 25     Image tempI []=new Image[cols*rows];
 26     int index=0;
 27     for (int i=0;i<rows;i++){
 28       for(int j=0;j<cols;j++){
 29             Image element=Image.createImage(img.getWidth()/cols,img.getHeight()/rows);
 30             Graphics temp=element.getGraphics();       
 31         temp.drawRegion(img,(img.getWidth()/cols)*j,(img.getHeight()/rows)*i
 32           ,img.getWidth()/cols,img.getHeight()/rows,ROT_NONE,0,0,Graphics.TOP|Graphics.LEFT);
 33             tempI[i*j+j]=element;
 34     }
 35     }
 36     return tempI;
 37   }
 38   public Image getCombinedImage(Image [] imArr){
 39     Image tempI=Image.createImage(getWidths(imArr),getHeights(imArr));
 40     Graphics tempG=tempI.getGraphics();
 41     int xPointer=0;
 42     for (int i=0;i<imArr.length;i++){    
 43     tempG.drawRegion(imArr[i],0,0,imArr[i].getWidth(),imArr[i].getHeight()
 44       ,ROT_NONE,xPointer,0,Graphics.TOP|Graphics.LEFT);
 45     xPointer+=imArr[i].getWidth();
 46   }
 47   return tempI;
 48   }
 49   public Image getCombinedImage(Image img1,Image img2){
 50     Image tempI=Image.createImage(img1.getWidth()+img2.getWidth(),img1.getHeight());
 51     Graphics tempG=tempI.getGraphics();   
 52     tempG.drawRegion(img1,0,0,img1.getWidth(),img1.getHeight()
 53       ,ROT_NONE,0,0,Graphics.TOP|Graphics.LEFT);  
 54     tempG.drawRegion(img2,0,0,img2.getWidth(),img2.getHeight(),ROT_NONE
 55       ,img1.getWidth(),0,Graphics.TOP|Graphics.LEFT);
 56       return tempI;
 57   }
 58   public int getWidths(Image [] im){
 59     int counts=0;
 60     for (int i=0;i<im.length;i++){
 61       counts+=im[i].getWidth();
 62     }
 63     return counts;
 64   }
 65   public int getHeights(Image [] im){
 66     int counts=0;
 67     for(int i=0;i<im.length;i++){
 68       if(counts<=im[i].getHeight()){
 69       counts=im[i].getHeight();
 70       }
 71     }
 72     return counts;
 73   }
 74   public Image getRotatedAndCombined(Image img,int rows,int cols){
 75     //1. olarak imaj gelecek alacak döndürüp bir image alacak ve imajı
 76     Image rots[]=new Image[4];
 77     int angles []={ROT_NONE,ROT_90,ROT_180,ROT_270};
 78     for(int i=0;i<4;i++){
 79     rots[i]=getCombinedImage(getRotations(img,rows,cols,angles[i]));
 80     }
 81     return getCombinedImage(rots);
 82   }
 83 }

Classın gövdesine bakıldığında,

public final static int ROT_90=5;
public final static int ROT_180=2;
public final static int ROT_270=6;
public final static int ROT_NONE=1;

gibi static integer değerler bulunmaktadır.

Bu değerleri Sprite classından elde ettim.Bunu nasıl elde ettiğimi tahmin edersiniz diye yazmayayım.(System.out.printl(""+Sprite.TRANS_90"); gibi)

Bu integer değerleri öğrendikten sonra kendi classımda kullanmak üzere değerlerini alıyorum bunlar ondan ibaret.

Kurucusu bişey yapmıyor.Orasını geçtik.

public Image getRotation(Image img,int angle){
	Image tempI=Image.createImage(img.getWidth(),img.getHeight());
	Graphics graph=tempI.getGraphics();
	graph.drawRegion(img,0,0,img.getWidth(),img.getHeight(),angle,0,0,Graphics.TOP|Graphics.LEFT);
	return tempI;
}

Konunun özüne gelirsek;Bu metotda İmajın kare olduğunu düşünürsek(başlangıç olarak kare aldım siz dikdörtgen olan imajlar için nasıl çalışılabilir tahmin etmeye çalışın.)kare imajın boyutlarını aldık ve bir Image yarattık.Bu boş bir Imagedir.Yani bembeyaz.Üzerine çizim yapabilmek için Image classının graphicsini aldık.

Ve graphics ile çizime başladık.Burada kullanılan metod drawRegion()'dur.(ilk parametre Image'dir.yani hangi imaj çizilecek.2,3,4,5.parametreler ise imajın üstündeki dikdörtgensel bölgeyi belirtiyor.6.parametre ise angle yani açısını belirtiyor.İşte önemli kısmı burasıdır.Bu değer yukarıdaki dört değerden biri secilerek verilirse.Ona göre döndürerek imajı çizer.7,8.parametre imaj resmin üzerinde hangi noktaya çizilecek onları belirtmektedir.

İşte diğer bütün özelliklerde buna dayanmaktadır.Mesela imajın parçalanması işi,bu iş de buna benzerdir.imajın rectangle'in başlangıç ve bitiş noktalarında oynama yapılarak istenen kadar bölünüp parçalanabilir imajlar.

Diğerlerini test ederek çalışabilirsiniz.

Dosya Listesi

İçindekilerGirişİndex
YukarıİlkÖnceki YokSonrakiSon
Geriİleri
Yazdır