【发布时间】:2016-07-04 13:18:50
【问题描述】:
我正在尝试使用 JavaFX 获取图像的一部分,但代码在 y = 1 时失败。
代码如下:
public static Image crop(Image src, int col, int row) {
PixelReader r = src.getPixelReader();
int sx = col * Grid.SIZE; // start x
int sy = row * Grid.SIZE; // start y
int ex = sx + Grid.SIZE; // end x
int ey = sy + Grid.SIZE; // end y
int rx = 0; // x to be written
int ry = 0; // y to be written
System.out.println(sx + ", " + sy + ", " + ex + ", " + ey);
WritableImage out = new WritableImage(Grid.SIZE, Grid.SIZE);
PixelWriter w = out.getPixelWriter();
for(int y = sy; y < ey; y++, ry++) {
for(int x = sx; x < ex; x++, rx++) {
int c = r.getArgb(x, y);
w.setArgb(rx, ry, c);
System.out.println(rx + ", " + ry + ", " + x + ", " + y);
}
}
return out;
}
一切顺利,直到循环中的y变成1,然后出现这种情况:
Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException: 32, 1
at com.sun.prism.Image$BaseAccessor.getIndex(Unknown Source)
at com.sun.prism.Image$BaseAccessor.setArgb(Unknown Source)
at com.sun.prism.Image.setArgb(Unknown Source)
at javafx.scene.image.WritableImage$2.setArgb(Unknown Source)
我不知道出了什么问题。我会提供任何其他信息。
【问题讨论】:
-
您能解释一下
Grid.SIZE是什么以及col和row在这个方法中应该代表什么吗?通常要进行裁剪,您会期望开始 x 和 y、宽度和高度。两个参数似乎不够。 -
@James_D
Grid.SIZE等于 32。它应该代表要裁剪的图像的宽度和高度,col和row是开始裁剪的列和行 -
那你为什么要
sx = col * Grid.SIZE? -
获取裁剪的起始位置。它应该是裁剪一个精灵表。如果
col等于1,则裁剪将从x = 32开始。 -
啊,好的。我不明白您所说的“开始裁剪的行和列”是什么意思。