我有一个 BufferedImage(任何一个都可以)。我提取一个子图像。 现在我想在子图像中定义一个感兴趣的区域, 并将我的子图像保存到另一个 BufferedImage 中,除了 感兴趣的区域透明。
到目前为止,我无法使该区域超出我的区域 利益透明。在下面的代码中,我想要的区域 透明的是区域a1.
任何指导将不胜感激。
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
public class Image {
public static void main(String[] args) {
int rules[] = {
AlphaComposite.DST_IN, AlphaComposite.DST_OUT, AlphaComposite.DST_OVER,
AlphaComposite.SRC_IN, AlphaComposite.SRC_OVER, AlphaComposite.SRC_OUT,
AlphaComposite.CLEAR };
try {
AlphaComposite ac = AlphaComposite.getInstance(rules[3]);
// Any image of the right size will do here. I'm just using this as a demo.d
BufferedImage original = ImageIO.read(new URL("https://eskipaper.com/images/abstract-art-1.jpg"));
BufferedImage sub = original.getSubimage(500, 400, 1050, 300);
Rectangle2D.Double r1 = new Rectangle2D.Double(0, 0, 1050, 300);
Area a1 = new Area(r1);
Ellipse2D.Double e1 = new Ellipse2D.Double(0, 0, 1050, 300);
Area a2 = new Area(e1);
Graphics2D g3d = sub.createGraphics();
g3d.setColor(new Color(0.0f, 0.0f, 0.0f, 0.0f));
a1.subtract(a2);
g3d.setComposite(AlphaComposite.getInstance(rules[3], 1.0f));
g3d.fill(a1);
ImageIO.write(sub, "png", new File("abstract-art-out.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
}