基本上,我正在为一个游戏加载spritesheets,但是我遇到了一个不能超过256x256的错误,这对于大型动画片来说显然是一个问题。
主要问题是当我通过ImageIO.read()方法将图像加载为BufferedImage时,然后使用BufferedImage中的getRGB()方法,它输出到int []。这很好,除了int数组需要大于256x256(因为这是最大整数值)。
最后将值从int []转换为int [] [],因此数组的最终大小不是问题,但BufferedImage.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();
}
我已经坚持了好几个小时,无法想办法做到这一点,到目前为止还没有见过其他人这个问题。
答案 0 :(得分:1)
来自doc:
public int[] getRGB(int startX,
int startY,
int w,
int h,
int[] rgbArray,
int offset,
int scansize)
返回默认RGB颜色模型中的整数像素数组 (TYPE_INT_ARGB)和默认的sRGB颜色空间,来自的一部分 图像数据。
w
和h
参数可让您指定要检索的区域的大小。
使用二维数组,您可以将图像的每一列存储在不同的一维数组中。
我还没有对此进行过测试,但类似的东西应该有用。
for(int i = 0; i < width; i++){
image.getRGB(i, 0, 1, height, pixels[i], 0, stride);
}