Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从图像中切割形状_Java_Graphics_Bufferedimage_Java 2d_Clipping - Fatal编程技术网

Java 从图像中切割形状

Java 从图像中切割形状,java,graphics,bufferedimage,java-2d,clipping,Java,Graphics,Bufferedimage,Java 2d,Clipping,我有一个缓冲图像和一系列形状,比如拼图。我想从图片上剪下这些形状。我试着剪辑图像,但它不能正常工作。到目前为止,我所做的是: for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { Area area = areas[i][j]; int width = (int) area.getBounds2D().getWidth();

我有一个缓冲图像和一系列形状,比如拼图。我想从图片上剪下这些形状。我试着剪辑图像,但它不能正常工作。到目前为止,我所做的是:

    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            Area area = areas[i][j];
            int width = (int) area.getBounds2D().getWidth();
            int height = (int) area.getBounds2D().getHeight();

            pieces[i][j] = new BufferedImage(width, height, image.getType());
            Graphics2D gr = pieces[i][j].createGraphics();
            gr.setClip(area);
            gr.drawImage(image, 0, 0, null);
            gr.dispose();

            try {
                ImageIO.write(pieces[i][j], "png", new File("img/img" + i + "" + j + ".png"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
for(int i=0;i

它只适用于第一个形状,然后将透明图像写入输出。

实际上有很多方法可以做到这一点。以下是我的方法:)

附加阅读:精灵表和动画

点击

实际上有很多方法可以做到这一点。以下是我的方法:)

附加阅读:精灵表和动画

点击

实际上有很多方法可以做到这一点。以下是我的方法:)

附加阅读:精灵表和动画

点击

实际上有很多方法可以做到这一点。以下是我的方法:)

附加阅读:精灵表和动画


点击

是否检查区域对象与图像边界的交点是否为空?(也就是说,形状在图像上方,而不是在其他地方或空的)如果您显示要剪辑的图像,并打印两个
区域,我认为这将有助于我们更好地理解这个问题。您只是想像@Glains thinks那样提取子图像,还是真的想像@lbalazscs thinks那样将单个图像剪裁成多个形状?:-)你肯定有必要在问题中添加至少一些形状的细节。第一个成功的形状,还有几个不成功。包括创建形状的数据,以及创建形状的
i
j
数据。是否检查区域对象与图像边界的交点是否为空?(也就是说,形状在图像上方,而不是在其他地方或空的)如果您显示要剪辑的图像,并打印两个
区域,我认为这将有助于我们更好地理解这个问题。您只是想像@Glains thinks那样提取子图像,还是真的想像@lbalazscs thinks那样将单个图像剪裁成多个形状?:-)你肯定有必要在问题中添加至少一些形状的细节。第一个成功的形状,还有几个不成功。包括创建形状的数据,以及创建形状的
i
j
数据。是否检查区域对象与图像边界的交点是否为空?(也就是说,形状在图像上方,而不是在其他地方或空的)如果您显示要剪辑的图像,并打印两个
区域,我认为这将有助于我们更好地理解这个问题。您只是想像@Glains thinks那样提取子图像,还是真的想像@lbalazscs thinks那样将单个图像剪裁成多个形状?:-)你肯定有必要在问题中添加至少一些形状的细节。第一个成功的形状,还有几个不成功。包括创建形状的数据,以及创建形状的
i
j
数据。是否检查区域对象与图像边界的交点是否为空?(也就是说,形状在图像上方,而不是在其他地方或空的)如果您显示要剪辑的图像,并打印两个
区域,我认为这将有助于我们更好地理解这个问题。您只是想像@Glains thinks那样提取子图像,还是真的想像@lbalazscs thinks那样将单个图像剪裁成多个形状?:-)你肯定有必要在问题中添加至少一些形状的细节。第一个成功的形状,还有几个不成功。包括创建形状的数据,以及
i
j
的数据。如果您想使用动态方法来计算1件的宽度和高度,只需调用
int width=sheet.getWidth()/colums但是你必须把工作表声明放在计算的最上面才能使这项工作起作用。在我看来,这个答案似乎没有抓住OP的要点,他(据我所知)想要剪切非矩形。我从问题文本中理解了一些其他内容,但如果这不是确切的答案,我很抱歉。对于一个更详细的问题,我需要一个更清晰的问题,最终给出的图像和首选的结果。(拼图块通常是正方形,所以这应该可以)如果你想用动态方法来计算1块的宽度和高度,只需调用
int width=sheet.getWidth()/colums但是你必须把工作表声明放在计算的最上面才能使这项工作起作用。在我看来,这个答案似乎没有抓住OP的要点,他(据我所知)想要剪切非矩形。我从问题文本中理解了一些其他内容,但如果这不是确切的答案,我很抱歉。对于一个更详细的问题,我需要一个更清晰的问题,最终给出的图像和首选的结果。(拼图块通常是正方形,所以这应该可以)如果你想用动态方法来计算1块的宽度和高度,只需调用
int width=sheet.getWidth()/colums但您必须将工作表声明
int width = 0;
int height = 0;
int rows = 0;
int columns = 0;
BufferedImage sheet = // you image goes here 
BufferedImage[] pieces = new BufferedImage[rows * cols];
for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
        pieces[(i * cols) + j] = sheet.getSubimage(j * width, i * height, width, height);    
    }
}
// Switch these lines
BufferedImage[][] pieces = new BufferedImage[rows][cols];
pieces[i][j] = sheet.getSubimage(j * width, i * height, width, height);