简体   繁体   English

如何在Java中Stich镜像对象

[英]How to Stich to Image objects in Java

I have a scenario in which i`m getting a number of tiles (eg12) from my mapping server. 我有一个场景,我在从地图服务器获取许多图块(eg12)。 Now for buffering and offline functions I need to join them all back again so that we have to deal with 1 single image object instead of 12. I ve tried to do it without JAI my code is below. 现在,对于缓冲和脱机功能,我需要再次将它们重新结合在一起,以便我们必须处理1个单个图像对象而不是12个图像对象。我尝试在不使用JAI的情况下进行处理,下面是我的代码。

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;

    }





}

now to check the my theory I m trying to join or stich two tiles horizontaly but i m getting the error : 现在检查我的理论,我m trying to join or stich two tiles horizontaly but i插入m trying to join or stich two tiles horizontaly but i出现错误:

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

is there some kind of limitation because when stiching two images of 300 x 300 horizontally it means the resulting image will be 600 x 300 ... that would make 180000 index size but its giving error at 90000, what am I doing wrong here 是否存在某种限制,因为当水平修剪两张300 x 300的图像时,这意味着生成的图像将是600 x 300 ...这将使索引大小为180000,但给出的错误为90000,我在这里做错了什么

rpi是结果像素的索引,而不是t1源切片数据中的索引,后者是大小的一半。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM