Java 对大于256x256的图像使用BuffereImage方法getRGB()

Java 对大于256x256的图像使用BuffereImage方法getRGB(),java,arrays,bufferedimage,Java,Arrays,Bufferedimage,基本上,我正在为游戏加载SpriteSheet,但我遇到了一个错误,其中页面不能大于256x256,这显然是大型动画页面的问题 主要问题是,当我通过ImageIO.read()方法将图像加载为BuffereImage,然后使用BuffereImage中的getRGB()方法时,它会输出到int[]。这很好,除非int数组需要大于256x256(因为这是最大整数值) 最后,值将从int[]转换为int[]],因此数组的最终大小不是问题,但BuffereImage.getRGB()仅输出到一维int

基本上,我正在为游戏加载SpriteSheet,但我遇到了一个错误,其中页面不能大于256x256,这显然是大型动画页面的问题

主要问题是,当我通过ImageIO.read()方法将图像加载为BuffereImage,然后使用BuffereImage中的getRGB()方法时,它会输出到int[]。这很好,除非int数组需要大于256x256(因为这是最大整数值)

最后,值将从int[]转换为int[]],因此数组的最终大小不是问题,但BuffereImage.getRGB()仅输出到一维int数组,因此如何使用大于该值的值来实现这一点?这是我的代码摘要

这是当我试图用不同的int[]分析两个不同部分的图像,然后将它们都放入int[]

private void load() {
        int width = 0, height = 0;
        int[] pixelsr = null, pixelsrr = null;
        try {
            BufferedImage image = ImageIO.read(new FileInputStream(path));
            width = image.getWidth();
            height = image.getHeight();
            pixels = new int[width][height];
            if (width >= 256 || height >= 256) {
                pixelsr = new int[256 * 256];
                image.getRGB(0, 0, w, h, pixelsr, 0, 256);
                pixelsrr = new int[(width - 256) * (height - 256)];
                image.getRGB(256, 256, width, height, pixelsr, 0, width - 256);
                for (int i = 0; i < pixelsr.length; i++) {
                    for (int ii = 0; ii < 256; ii++) {
                        for (int iii = 0; iii < 256; iii++) {
                            pixels[ii][iii] = pixelsr[ii + iii * 256];
                        }
                    }
                }
                for (int i = 0; i < pixelsrr.length; i++) {
                    for (int ii = 256; ii < width - 256; ii++) {
                        for (int iii = 256; iii < height - 256; iii++) {
                            pixels[ii][iii] = pixelsr[ii + iii * (width - 256)];
                        }
                    }
                }
            } else {
                pixelsr = new int[width * height];
                image.getRGB(0, 0, w, h, pixelsr, 0, width);
                for (int i = 0; i < pixelsr.length; i++) {
                    for (int ii = 0; ii < width; ii++) {
                        for (int iii = 0; iii < height; iii++) {
                            pixels[ii][iii] = pixelsr[ii + iii * width];
                        }
                    }
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
private void load(){
整数宽度=0,高度=0;
int[]pixelsr=null,pixelsr=null;
试一试{
BuffereImage image=ImageIO.read(新文件输入流(路径));
宽度=image.getWidth();
高度=image.getHeight();
像素=新整数[宽度][高度];
如果(宽度>=256 | |高度>=256){
pixelsr=新整数[256*256];
getRGB(0,0,w,h,pixelsr,0,256);
pixelsrr=新整数[(宽度-256)*(高度-256)];
getRGB(256,256,宽度,高度,像素,0,宽度-256);
对于(int i=0;i
我已经在这个问题上纠缠了好几个小时,找不到解决方法,到目前为止还没有看到其他人有这个问题。

来自:

返回默认RGB颜色模型中的整数像素数组 (键入_INT_ARGB)和默认的sRGB颜色空间,从 图像数据

w
h
参数用于指定要检索的区域的大小

使用二维数组,可以将图像的每列存储在不同的一维数组中

我还没有测试过这个,但是类似的东西应该可以工作

for(int i = 0; i < width; i++){
    image.getRGB(i, 0, 1, height, pixels[i], 0, stride);
}
for(int i=0;i
首先,256x256不是最大的int值…256x256=65536,而Java的设计是32位或64位。32位无符号整数范围是0..4294967296;因此理论上可以有4GB的图像,并且没有问题。正如@AhmedMasud已经指出的,这个问题的整个前提是不正确的。因此很难说到底是什么这就是问题所在。只需使用
getRGB(…)
方法,不要担心图像有多大。:)没有到多维数组的神奇转换,如果您尝试,Java也不会允许。
for(int i = 0; i < width; i++){
    image.getRGB(i, 0, 1, height, pixels[i], 0, stride);
}