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

Posted

技术标签:

【中文标题】用于绘制图像的 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 【发布时间】:2019-12-21 12:58:30 【问题描述】:

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

出于性能原因,我不想构建中间图像,这可以通过 api 实现吗?

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

【问题讨论】:

我认为如果没有中间图像就无法做到这一点。 (在 JavaFX 中绝对可以,使用节点的 clip 属性。) 【参考方案1】:

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

如果你决定要走这些路线,请戳我。

【讨论】:

【参考方案2】:

在下面的 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();

   

【讨论】:

感谢您的回复,但我正在寻找专门用于绘制图像而非形状的解决方案。 我更新了我的答案。只需提供图像的位置。您可能需要调整比例以使其正确适合。但我仍然不确定你想用它做什么。 @WJS 我建议您使用以下网络资源将您的答案设为minimal reproducible example:ImageIO.read(new URL("http://www.digitalphotoartistry.com/rose1.jpg")); @wjs 再次感谢,但我正在寻找的与此不同,它甚至可能无法使用 API,但我提供了一个简单的示例图像,我可以想到说明我要描述的内容。

以上是关于用于绘制图像的 Java Graphics2D 方法,其中使用了像素 alpha 值但颜色值被替换为给定的颜色的主要内容,如果未能解决你的问题,请参考以下文章

在图像上绘制 Graphics2D 形状

Java中的Graphics2D类基本使用教程

使用 Graphics2D 翻转图像

java Graphics2D绘制文字并居中并解决服务器乱码问题

Java Graphics2D:在上一个下绘制下图

绘制几何图形