提取具有透明背景的图像部分

问题描述 投票:0回答:0

我有一个 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();
    }
  }
}
java swing graphics
© www.soinside.com 2019 - 2024. All rights reserved.