2010-04-21 63 views
0

我有一個場景,我從我的映射服務器獲取一定數量的圖塊(例如12)。現在,爲了緩衝和離線功能,我需要再次將它們全部加入,以便我們必須處理1個單個圖像對象而不是12個。我試圖在沒有JAI的情況下執行它,我的代碼如下所示。如何使用Java創建圖像對象

package imagemerge; 


import java.awt.*; 
import java.awt.image.*; 
import java.awt.event.*; 

public class ImageSticher extends WindowAdapter { 

    Image tile1; 
    Image tile2; 
    Image result; 
    ColorModel colorModel; 
    int width,height,widthr,heightr; 
    //int t1,t2; 
    int t12[]; 


    public ImageSticher() 
    { 

    } 

    public ImageSticher (Image img1,Image img2,int w,int h) 
    { 
     tile1=img1; 
     tile2=img2; 

     width=w; 
     height=h; 
     colorModel=ColorModel.getRGBdefault(); 

    } 

    public Image horizontalStich() throws Exception 
    { 

     widthr=width*2; 
     heightr=height; 

     t12=new int[widthr * heightr]; 

     int t1[]=new int[width*height]; 
     PixelGrabber p1 =new PixelGrabber(tile1, 0, 0, width, height, t1, 0, width); 
     p1.grabPixels(); 

     int t2[]=new int[width*height]; 
     PixelGrabber p2 =new PixelGrabber(tile2, 0, 0, width, height, t1, 0, width); 
     p2.grabPixels(); 

     int y, x, rp, rpi; 
     int red1, red2, redr; 
     int green1, green2, greenr; 
     int blue1, blue2, bluer; 
     int alpha1, alpha2, alphar; 

     for(y=0;y<heightr;y++) 
     { 
      for(x=0;x<widthr;x++) 
      { 
       //System.out.println(x); 
       rpi=y*widthr+x; // index of resulting pixel; 
       rp=0;   //initializing resulting pixel 
       System.out.println(rpi); 

       if(x<(widthr/2)) // x is less than width , copy first tile 
       { 
        //System.out.println("tile1="+x); 
        blue1 = t1[rpi] & 0x00ff; // ERROR occurs here 
        green1=(t1[rpi] >> 8) & 0x00ff; 
        red1=(t1[rpi] >> 16) & 0x00ff; 
        alpha1 = (t1[rpi] >> 24) & 0x00ff; 

        redr = (int)(red1 * 1.0); // copying red band pixel into redresult,,,,1.0 is the alpha valye 
        redr = (redr < 0)?(0):((redr>255)?(255):(redr)); 
        greenr = (int)(green1 * 1.0); // 
        redr = (int)(red1 * 1.0); // 
        greenr = (greenr < 0)?(0):((greenr>255)?(255):(greenr)); 
        bluer = (int)(blue1 * 1.0); 
        bluer = (bluer < 0)?(0):((bluer>255)?(255):(bluer)); 
        alphar = 255; 

        //resulting pixel computed 
        rp = (((((alphar << 8) + (redr & 0x0ff)) << 8) + (greenr & 0x0ff)) << 8) + (bluer & 0x0ff); 


       } 
       else // index is ahead of half way...copy second tile 
       { 

        blue2 = t2[rpi] & 0x00ff; // blue band bit of first tile 
        green2=(t2[rpi] >> 8) & 0x00ff; 
        red2=(t2[rpi] >> 16) & 0x00ff; 
        alpha2 = (t2[rpi] >> 24) & 0x00ff; 

        redr = (int)(red2 * 1.0); // copying red band pixel into redresult,,,,1.0 is the alpha valye 
        redr = (redr < 0)?(0):((redr>255)?(255):(redr)); 
        greenr = (int)(green2 * 1.0); // 
        redr = (int)(red2 * 1.0); // 
        greenr = (greenr < 0)?(0):((greenr>255)?(255):(greenr)); 
        bluer = (int)(blue2 * 1.0); 
        bluer = (bluer < 0)?(0):((bluer>255)?(255):(bluer)); 
        alphar = 255; 

        //resulting pixel computed 
        rp = (((((alphar << 8) + (redr & 0x0ff)) << 8) + (greenr & 0x0ff)) << 8) + (bluer & 0x0ff); 


       } 
       t12[rpi] = rp; // copying resulting pixel in the result int array which will be converted to image 

      } 
     } 

     MemoryImageSource mis; 
     if (t12!=null) { 
      mis = new MemoryImageSource(widthr, heightr, colorModel, t12, 0, widthr); 
      result = Toolkit.getDefaultToolkit().createImage(mis); 
      return result; 

     } 
     return null; 

    } 





} 

現在來檢查我的理論我m trying to join or stich two tiles horizontaly but i m到處錯誤:

java.lang.ArrayIndexOutOfBoundsException:90000 在imagemerge.ImageSticher.horizo​​ntalStich(ImageSticher.java:69) 在imageStream.ImageStream .getImage(ImageStream.java:75) 在imageStream.ImageStream.main(ImageStream.java:28)

是有一些因爲拼接的300×300水平地兩個圖像時種限制就意味着所得到的圖像將是600 x 3 00 ...這將使180000指數大小,但它給錯誤在90000,我在做什麼錯這裏

回答

1

rpi是您的結果像素的索引,而不是您的源瓷磚數據中的索引t1,這是一半尺寸。

+0

好的,謝謝我做了更正,但現在它只顯示第二個圖像對象,也在第一個圖像的位置和它自己的空間在新圖像中是BLACK – Imran 2010-04-21 12:29:45