Java 用于绘制图像的 Graphics2D 方法,其中使用像素 alpha 值但颜色值替换为给定颜色

Java Graphics2D method for drawing an image where the pixel alpha values are used but the colour values are replaced with a given colour

我一直在阅读 Graphics2D 的 API 并且看到了所有可用复合模式的示例(类似于 photoshop 混合模式)但我看不到一种方法将源图像绘制到目标缓冲图像以我指定的颜色,例如我的源图像是完全透明背景上的白色不透明圆圈,我如何使用它绘制到缓冲区以便绘制彩色圆圈。

出于性能原因,我不希望构建中间图像,这可以用 api 实现吗?

编辑:我添加了一张图片,希望能帮助展示我试图描述的操作。这是在开放式 GL 等中绘制精灵的常用方法,我只是想知道如何使用 Graphics2D API 来做同样的事情。

在下面的 imageName 中指定您的图片的位置。

public class ColoredCircle extends JPanel {

   JFrame        frame     = new JFrame();

   BufferedImage buf;
   String        imageName = "F://ngc_1300_spiral.jpg";

   public static void main(String[] args) {
      new ColoredCircle().start();
   }

   int scale = 10;

   public void start() {
      try {
         buf = ImageIO.read(new File(imageName));
      }
      catch (IOException ioe) {
         ioe.printStackTrace();
      }
      setPreferredSize(
            new Dimension(buf.getWidth() / scale, buf.getHeight() / scale));
      frame.add(this);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
      repaint();
   }

   public void paintComponent(Graphics g) {
      super.paintComponent(g);
      Graphics2D g2d = (Graphics2D) g.create();
      g2d.drawImage(buf,
            0,
            0,
            buf.getWidth() / scale,
            buf.getHeight() / scale,
            null);
      g2d.dispose();

   }
}

是否可以使用API但是你必须编写自己的ImageProducer子类类似于FilteredImageSource但是有两个输入图像而不是一个。但正因为如此,最终结果将需要比手动实施更多的代码行,而且效率也不会更高。或者,您可以使用现有的 FilteredImageSource 并编写一个 ImageFilter 子类来包装第二张图像并完成艰苦的工作。

如果您决定要走这些路线中的任何一条,请戳我。