2

私はポリゴンクラスを操作していて、ポリゴン内のピクセル値を透明に設定するか、可能であればそれらをすべて一緒に削除しようとしていますが、値をRGBとして保存しようとしているため、少し壁にぶつかりましたint値であり、この方法でピクセルを透明/削除する方法がわかりません。

これに加えて、私も同じことをしたいと思いますが、ポリゴン内に含まれるピクセルのみを残すために、可能であればポリゴンの内側にピクセルを保持し、外側のピクセルを削除します。私は以前にこれを探し回ったことがありますが、役に立ちませんでした。

私はこれのためにSSCCEを作成しようとしましたが、時間をかけて助けてくれる人が簡単に操作して表示できるようにしましたが、作成に取り組んでいるはるかに大きなプログラムの一部であるため、時間がかかることが証明されていますが、一度はこの問題をよりよく示すために作業している人がいます。この投稿を編集します。

この問題で私を助けるために時間を割いてくれた誰かに感謝します

以下に、すでに指定されたポリゴン内に含まれるピクセルをセグメント化するために現在使用しているコードをいくつか示します。これは、ポリゴンの外側のピクセルを透明に設定する方法と非常によく似ていますが、ifステートメントの引数を入れ替えて画像のセグメントを削除し、画像を保存するのではなくnewImageを返すだけで、完全に機能します。この方法でポリゴンに含まれるピクセルを保存すると、何らかの理由で保存されません。

    public void saveSegment(int tabNum, BufferedImage img) {
    segmentation = new GUI.Segmentation();
    Polygon p = new Polygon();
    Color pixel;

    p = createPolygon(segmentation);

    int height = img.getHeight();
    int width = img.getWidth();
    newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);

    //loop through the image to fill the 2d array up with the segmented pixels
    for(int y = 0; y < height; y++) {
        for(int x = 0; x < width; x++) {

            //If the pixel is inside polygon
            if(p.contains(x, y) == true) {
                pixel = new Color(img.getRGB(x, y));
                //set pixel equal to the RGB value of the pixel being looked at
                int r = pixel.getRed(); // red component 0...255
                int g = pixel.getGreen(); // green component 0...255
                int b = pixel.getBlue(); // blue component 0...255
                int a = pixel.getAlpha(); // alpha (transparency) component 0...255
                int col = (a << 24) | (r << 16) | (g << 8) | b;
                newImage.setRGB(x, y, col);
            }
            else {
                pixel = new Color(img.getRGB(x, y));
                int a = 0; // alpha (transparency) component 0...255
                int col = (a << 24);
                newImage.setRGB(x, y, col);
            }
        }
    }
    try {
        //then save as image once all in correct order
        ImageIO.write(newImage, "bmp", new File("saved-Segment.bmp"));
        JOptionPane.showMessageDialog(null, "New image saved successfully");
    } catch (IOException e) {
        e.printStackTrace();
    }
}
4

1 に答える 1

3

より簡単な方法は、Java2D のクリッピング機能を使用することです。

BufferedImage cutHole(BufferedImage image, Polygon holeShape) {

    BufferedImage newImage = new BufferedImage(
        image.getWidth(), image.getHeight(), image.getType());

    Graphics2D g = newImage.createGraphics();

    Rectangle entireImage =
        new Rectangle(image.getWidth(), image.getHeight());

    Area clip = new Area(entireImage);
    clip.subtract(new Area(holeShape));

    g.clip(clip);
    g.drawImage(image, 0, 0, null);

    g.dispose();

    return newImage;
}

BufferedImage clipToPolygon(BufferedImage image, Polygon polygon) {

    BufferedImage newImage = new BufferedImage(
        image.getWidth(), image.getHeight(), image.getType());

    Graphics2D g = newImage.createGraphics();

    g.clip(polygon);
    g.drawImage(image, 0, 0, null);

    g.dispose();

    return newImage;
}
于 2013-02-23T02:07:39.450 に答える