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
子类来包装第二张图像并完成艰苦的工作。
如果您决定要走这些路线中的任何一条,请戳我。
我一直在阅读 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
子类来包装第二张图像并完成艰苦的工作。
如果您决定要走这些路线中的任何一条,请戳我。