Java 为createWritableChild剪切图像IllegalArgumentException

Java 为createWritableChild剪切图像IllegalArgumentException,java,graphics,bufferedimage,Java,Graphics,Bufferedimage,所以我希望有人能帮我解决这个问题。我正在为我的计算机图形学课写一个拼图游戏,我在试图把我的图像分割成碎片时遇到了一点小麻烦。我相信问题出在createWritableChild上,但说实话,这个错误消息并不十分清楚,所以我不确定。这是我的错误: 线程“AWT-EventQueue-0”java.lang.IllegalArgumentException:Raster ByteInterlevedRaster:width=45 height=45#numDataElements 3 dataOff

所以我希望有人能帮我解决这个问题。我正在为我的计算机图形学课写一个拼图游戏,我在试图把我的图像分割成碎片时遇到了一点小麻烦。我相信问题出在createWritableChild上,但说实话,这个错误消息并不十分清楚,所以我不确定。这是我的错误:

线程“AWT-EventQueue-0”java.lang.IllegalArgumentException:Raster ByteInterlevedRaster:width=45 height=45#numDataElements 3 dataOff[0]=137中的异常具有不等于零的minX或minY:45 0 位于java.awt.image.buffereImage。(未知源) 在JigsawPuzzle.runPuzzleCreate(JigsawPuzzle.java:106) 在JigsawPuzzle.gameBoardCreate(JigsawPuzzle.java:137) JigsawPuzzle$3.paintComponent(JigsawPuzzle.java:65)

以下是引发错误的代码:

//Cuts up the given Image and creates the Puzzle and its Pieces.
public Puzzle runPuzzleCreate(BufferedImage p){
    int pieceCount = 150;
    int pieceSize = 45;
    Piece[] pieces = new Piece[pieceCount];
    Piece[] scaled = new Piece[pieceCount];
    Puzzle puzzle = new Puzzle(p, pieces, scaled);
    ColorModel cm = p.getColorModel();
    boolean premult = cm.isAlphaPremultiplied();
    WritableRaster raster = p.copyData(null);
    Posn pos = new Posn(0, 0);
    for(int i = 0; i < pieceCount; i++){
        if(pos.xPos <= 555){
            WritableRaster childRaster = 
                raster.createWritableChild(pos.xPos, pos.yPos,
                        pieceSize, pieceSize,
                        pos.xPos, pos.yPos,
                        null);
            BufferedImage pieceImage = new BufferedImage(cm, childRaster,
                    premult, null);
            Piece piece = new Piece(pieceImage, pos);
            pieces[i] = piece;
            scaled[i] = piece;
            pos.xPos += pieceSize;
        } else if (pos.yPos <= 450){
            pos.yPos += pieceSize;
            pos.xPos = 0;
        } else {
            break;
        }
    }
    return puzzle;
}
//切割给定的图像并创建拼图及其碎片。
公共拼图运行拼图创建(BuffereImage p){
整数计件计数=150;
int-pieceSize=45;
件[]件=新件[件计数];
工件[]缩放=新工件[工件计数];
拼图=新拼图(p、碎片、缩放);
ColorModel cm=p.getColorModel();
布尔premult=cm.isAlphaPremultiplied();
可写光栅=p.copyData(空);
Posn pos=新Posn(0,0);
对于(int i=0;i如果(pos.xPos很遗憾没有记录此异常,但是查看其消息和BuffereImage的源代码,您似乎需要为
raster.createWritableChild()的第5个或第6个参数(或两者)传递0
方法调用。

谢谢你,工作得很好。不过这让我很扫兴,因为CreateWriteableChild()的文档说明如下:要创建包含当前可写光栅子区域但共享其坐标系和标注栏的新可写光栅,应在childMinX等于parentX、childMinY等于parentY和bandList等于null的情况下调用此方法。所以我想我误解了这句话。