【问题标题】:Cutting up Image IllegalArgumentException for createWritableChild为 createWritableChild 切割图像 IllegalArgumentException
【发布时间】:2011-07-01 11:29:26
【问题描述】:

所以我希望有人能够帮助我解决这个问题。我正在为我的计算机图形课程编写一个拼图游戏,在尝试将我的图像切割成碎片时遇到了一些障碍。我相信问题出在 createWritableChild 上,但说实话,这个错误消息并不完全清楚,所以我不确定。这是我的错误:

线程“AWT-EventQueue-0”中的异常 java.lang.IllegalArgumentException: Raster ByteInterleavedRaster: width = 45 height = 45 #numDataElements 3 dataOff[0] = 137 的 minX 或 minY 不等于零:45 0 在 java.awt.image.BufferedImage.(未知来源) 在 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;
}

【问题讨论】:

    标签: java graphics bufferedimage


    【解决方案1】:

    很遗憾没有记录这个异常,但是查看它的消息和 BufferedImage 的源代码,您似乎需要为 raster.createWritableChild() 方法调用的第 5 个或第 6 个参数(或两者)传递 0。

    【讨论】:

    • 谢谢伙计,效果很好。这让我很失望,因为 createWritableChild() 的文档说:要创建一个新的 WritableRaster,它包含当前 WritableRaster 的一个子区域,但共享其坐标系和波段,应该使用 childMinX 等于 parentX,childMinY 来调用此方法到 parentY,bandList 等于 null。所以我想我误解了这个说法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 2015-11-03
    • 2013-03-14
    • 1970-01-01
    • 2015-05-29
    • 2014-10-15
    相关资源
    最近更新 更多