gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:09:38 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com