如何解决顺便说一句,差异图形 fillRect 和 clearRect
当我想用半透明背景色初始化 BufferedImage 时,我注意到 fillRect 和 clearRect 之间有一些有趣的区别:
使用fillRect:
Color someHalfTransparentColor = new Color(Integer.parseInt("77affe07",16),true);
BufferedImage bi = new BufferedImage(10,10,BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g = bi.createGraphics();
g.setColor(someHalfTransparentColor);
g.fillRect(0,10);
g.dispose();
System.out.println(Integer.toString(bi.getRGB(0,0),16));
// WORKS NOT AS EXPECTED: 77b0ff06 != 77affe07
使用 clearRect:
Color someHalfTransparentColor = new Color(Integer.parseInt("77affe07",BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g = bi.createGraphics();
g.setBackground(someHalfTransparentColor);
g.clearRect(0,16));
// WORKS AS EXPECTED: 77affe07 == 77affe07
似乎在使用 fillRect 时,颜色值略有变化。有人可以解释这种行为吗?
解决方法
区别在于fillRect
使用了Graphics2D
的当前组合(getComposite
),而clearRect
忽略了它。默认情况下,复合是 AlphaComposite.SrcOver
。当绘制一个新的矩形时,这个合成将通过结合目的地的颜色和将要绘制的颜色与一些数学运算来决定最终的颜色。
另一方面,(至少在我的 JDK 版本中)clearRect
将复合临时设置为 AlphaComposite.Src
(因此忽略当前复合),这完全忽略了目标,并简单地复制你想画到你想要的地方的颜色。
您可以看到,如果您在 g.setComposite(AlphaComposite.Src);
之前执行 fillRect
,您将获得与 clearRect
相同的输出。
文档中提到这一点的部分是:
此操作不使用当前的绘制模式。
为 Graphics2D 上下文设置复合。 Composite 用于所有绘图方法,例如 drawImage
、drawString
、draw
和 fill
。它指定在渲染过程中如何将新像素与图形设备上的现有像素组合。
可以说:
-
clearRect
不是“绘图方法”。它会擦除内容,因此setComposite
不适用于它。 - 复合是“绘制模式”的一部分(文档出于某种原因没有定义这个术语),因此
clearRect
不使用它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。