用于绘制图像的 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 值但颜色值被替换为给定的颜色的主要内容,如果未能解决你的问题,请参考以下文章