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
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