2010-04-21 4 views
0

J'ai un scénario dans lequel j'obtiens un certain nombre de tuiles (par exemple 12) de mon serveur de cartographie. Maintenant, pour les fonctions de mise en mémoire tampon et hors ligne, je dois les relier tous de nouveau afin que nous ayons à traiter avec un seul objet image au lieu de 12. J'ai essayé de le faire sans JAI mon code est ci-dessous.Comment coller des objets Image en 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; 

    } 





} 

maintenant pour vérifier la ma théorie, je ne suis pas m trying to join or stich two tiles horizontaly but i obtenir l'erreur:

java.lang.ArrayIndexOutOfBoundsException: 90000 à imagemerge.ImageSticher.horizontalStich (ImageSticher.java:69) à imageStream.ImageStream .getImage (ImageStream.java:75) à imageStream.ImageStream.main (ImageStream.java:28)

est-il une sorte de limitation parce que quand stiching deux images de 300 x 300 horizontalement cela signifie que l'image résultante sera 600 x 3 00 ... qui ferait 180000 taille de l'index, mais son erreur en donnant à 90000, ce que je fais mal ici

Répondre

1

rpi est l'indice de votre pixel résultant, pas l'index dans vos données de tuiles source dans t1, qui est la moitié la taille.

+0

ok merci j'ai fait la correction mais maintenant c'est seulement montrer le 2ème objet Image et cela aussi à la place de 1st Image et son propre espace dans la nouvelle image est NOIR – Imran

Questions connexes