java绘画中的锯齿问题

java给图中的锯齿问题也称作呈现兼容性问题

JDK(tm)1.1呈现模型是基于像素给的模型,该模型的坐标无限细分,且位于像素之间。使用一个一像素宽的画笔执行绘制操作,填充路径锚点向下和向右的像素。JDK1.1呈现模型与大多数现有平台呈现类的功能一致,需要将整数坐标解析为离散的画笔,使其完全落在指定的像素成员上。

JDK 2D(tm) (Java(tm)2平台)API支持抗锯齿呈现器。一像素宽的画笔不需要完全落在像素N或N+1上。该画笔可以部分落在这两个像素上。不需要为宽画笔选择一个偏离方向,因为沿画笔遍历边缘发生的混合可让画笔的子像素位置对用户可见。另一方面,如果通过将KEY_ANTIALIASING提示键设置为VALUE_ANTIALIAS_OFF提示值面关闭了抗锯齿,则当画笔跨在像素边界上时,呈现器可能需要应用偏离来确定要修改哪个像素,例如在设备空间中,当画笔沿着整数坐标绘制时。虽然抗锯齿呈现器的功能使之不再需要 呈现模型为画笔指定一个偏离,但对于在屏幕上绘制一像素宽的水平线和垂直线这种常见情形,还是需要抗锯齿和非抗锯齿呈现器执行类似的操作。为了确保将KEY_ANTIALIASING提示键设置为VALUE_ANTIALIAS_ON而打开的抗锯齿不会导致这些线突然变为此宽度的二倍或一半不透明,需要让该 模型为这些线指定一个路径,使它们完全覆盖特定的像素集,以帮助提高其平滑性。

Java 2D API 维持与 JDK 1.1 呈现行为的兼容性,遗留操作和现有呈现器行为在 Java 2D API 下没有改变。定义了映射到常规 drawfill 方法的遗留方法,它明确指示 Graphics2D 根据 StrokeTransform 属性以及呈现提示的设置扩展 Graphics 的方式。在默认属性设置下该定义的执行方式完全相同。例如,默认 Stroke 是一个宽度为 1 且没有虚线的 BasicStroke,屏幕绘制的默认 Transform 是 Identity 转换。

下面两个规则提供了可预见的呈现行为(无论是否使用了重叠还是抗锯齿)。

将设备坐标定义为在设备像素之间,这避免了重叠呈现和抗锯齿呈现的结果不一致。如果将坐标定义为在像素的中心,则由矩形等形状覆盖的某些像素仅是半覆盖。通过重叠的呈现,半覆盖的像素可能呈现在形状内部,也可能呈现在形状外部。使用抗锯齿呈现,整个形状边缘上的像素都是半覆盖的。另一方面,由于坐标被定义在像素之间,所以无论是否使用抗锯齿进行呈现,像矩形这样的形状将不会有半覆盖像素。

使用 BasicStroke 对象勾画的线和路径可以“标准化”,从而在不同的可绘制点上定位时,无论使用重叠还是抗锯齿呈现进行的绘制都能提供一致的轮廓呈现。此标准化过程通过KEY_STROKE_CONTROL提示控制。虽然未指定准确的标准化算法,但此标准化的目标是为了确保可以使用一致的可视外观呈现线条,而不考虑它们在像素网格上的位置;另一个目的是促进以抗锯齿模式呈现更连续的水平和垂直线,从而与没有抗锯齿的线更为相似。典型的标准化步骤可以将抗锯齿线端点提升到像素中心,以减少混合量;也可以调整无抗锯齿线的子像素位置,以便浮点线宽度舍入为近似相等的偶数或奇数像素计数。此过程可以将端点向上移动半个像素(通常沿两个坐标轴的正无穷大方向移动),以得到一致的结果。

posted @ 2012-05-03 17:41  Brin Page  阅读(1003)  评论(0编辑  收藏  举报