java - 删除 BufferedImage 像素值和/或将其设置为透明

标签 java polygon bufferedimage alpha pixel

我一直在使用多边形类,并尝试将多边形内部的像素值设置为透明,或者如果可能的话将它们全部删除,但是当我尝试存储值作为 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();
    }
}

最佳答案

更简单的方法是使用 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;
}

关于java - 删除 BufferedImage 像素值和/或将其设置为透明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15035969/

相关文章:

java - 首选项文件位置

matlab - 查找由区域掩码表示的多边形的角

graphics - 最小化多边形顶点

java - 将 2 种 RGB 颜色与 Alpha 组合

java - 读取14位和16位图像

Java 应用程序未将菜单打印到屏幕上

java.net.ConnectException : Connection refused: connect, 启动已取消

javascript - 我将如何实现鞋带定理来找到由相交线创建的多个凸多边形的面积?

java - JPanel 和 BufferedImage

java - 如何在 java 中使用另一个包中的 OSGI 引用