欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

<2D Graphics>读书笔记----第二章(2.0) 博客分类: Java 2D/3D 读书算法 

程序员文章站 2024-02-16 22:30:34
...

绘图操作流程

       Graphics2D的内部状态属性决定如何去绘制图形。Graphics2D的内部状态包括以下七种:

         paint

               Paint决定着色方法。着色方法用于填充诸如笔划路径或形状内部等区域的颜色。可以创建单色的着色法,也可以用变化的色调进行着色,或者使用平铺的填充模式。

        stroke

               Stroke决定笔划。笔划用于绘制形状的边框。可以选择边框的粗细和线段的虚实以及笔划样式与线段连接样式。

        font

               文本的绘制是通过创建一个表示要绘制的字符的形状,然后填充这个形状而得。而font决定了对一个给定的字符集,所创建形状样式。

        transformation

               所有的图形元素在绘制前会经过一个几何变换,用于在绘制期间将图形元素从用户空间变换到设备空间。

        compositing rule

               组合规则决定了目标图象与源图象颜色的组合方式。

        clipping shape

               所有的绘制操作将会限制在这个剪切形状中(clipping shape),在这个形状之外的点不会受到影响。默认情况下,这个剪切形状为null。也就是说绘制的范围只受目标图象的限制。

        rendering hints

               Java 2D API 允许用户选择是尽快绘制对象,还是倾向于以尽可能高的质量绘制对象。通过指定Graphics2D内部状态的绘制建议(rendering hints) 属性来反映用户的选择。并非所有的平台都支持对绘制模式的修改,因此指定绘制模式的建议并不能保证一定会被使用。

        图形元素在绘制过程中会经过一系列的操作,称之为“绘制流程”(rendering pipeline),可以分为五个步聚,其中第一步依赖于要绘制图形元素的种类。

      ①决定要将绘制的形状。对于使用fill()方法来绘制的Shape,这个Shape会使用当前的transformation属性来做几何变换;而对使用draw()方法来绘制的Shape,首先会根据当前的stroke属性将Shape的轮廓转换为另一个Shape(对这个Shape调用fill方法就得到原来Shape的轮廓),然后可归结为第一种情况;文本的绘制是将根据当前的Font属性将字符转换为Shape,然后归结为第一种情况;对于绘制图象,根据当前的transformation属性对图象实现变换。

        正如我们所看到的,实际上Graphics2D只会做两种事:填充图形与绘制图象。绘制图形与绘制字符串看起来事两种不同的操作,实际上它们只是填充图形的特殊情形。

        ②光栅化图形。光栅化是指将理想的形状(理想的形状是连续的,而实际我们只能处理离散的东西)转换为一个带值的点集。绘制建议就是控制光栅化质量的属性。对于绘制图象的情况,其本身就是一个光栅化的数据。

        ③对形状进行剪切。使用当前的剪切形状对形状进行剪切。

        ④决定要使用的颜色。对于填充图形操作,使用Paint属性来决定如何决定着色方式。对于绘制图象,其本身已经带有颜色的信息。

        ⑤组合颜色。使用当前的组合规则将图形颜色与目标图形的颜色组合。

 

关于透明

        绘制只是一种近似,因为在离散化过程中肯定会造成误差。举个例子:假设这个有个形状(Shape),需要使用某种颜色来填充。那么有多种不同的可以实现这种操作。其中有的速度快,有的效果好。

        Ⅰ 锯齿与反锯齿

                   最快的方法就是将Shape内部的点全部着色,而不理会其他的点。使用这种算法,每个象素要么是完全被着色,要么完全没有变化。这种算法会造成生成的图象看起来有个很粗糙的边界,图形学上称之为“走样”(aliased)。

                   为了提高图形质量,必须克服或减少走样现象。光栅图形的反走样方法主要有两类:
                   第一类是超采样或称后置滤波。这类算法的基本思想着眼于提高分辨率,虽然采用高分辨率的光栅图形显示器也是一个选择,但它受到客观条件的限制,而且也不经济。因此,我们往往采用软件实现的方法,即:将低分辨率的图形像素划分为许多子像素,在较高分辨率上对各子像素的颜色值或灰度值进行计算,然后采用某种平均算法,将原像素内的各子像素的颜色值或灰度值的平均值作为该像素显示的颜色值或灰度值,在较低分辨率的光栅图形设备上进行显示。
                   第二类方法称为前置滤波。即:把像素作为一个有限区域而不是一个面积为零的点来处理。

        Ⅱ 光栅化

                   在绘图操作流程中,光栅化将一个理想形状转换为一个点集。其中每个点有个表征其覆盖程度的值,这个值叫做Alpha分量。每个点都有个alpha分量,一个图象的所有点的alpha值叫做Alpha通道。(alpha channel)

                   alpha一般取值范围为0.0到1.0。alpha为0时表示完全不覆盖,也就是完全透明;alpha为1是表示完全覆盖。

 

复合

        当两个图形对象重叠时,有必要确定使用哪些颜色来处理重叠像素。例如,如果红色矩形与蓝色矩形相重叠,则其重叠区域应该处理为红色、蓝色或二者的某种组合。重叠区域中像素的颜色决定于哪一个矩形位于上面及其透明程度。确定使用何种颜色处理重叠对象所共有像素的过程称为复合

坐标系统

               Java 2D API 有两种坐标系统:

  • <!---->用户空间是一种与设备无关的逻辑坐标系统。应用程序独占使用此坐标系统。所有传入 Java 2D 绘制例程中的几何图形均在用户空间中定义。
  • <!---->设备空间是一种与设备有关的坐标系统,它根据目标绘制设备的不同而变化。
<!---->

Java 2D 系统自动在用户空间和目标绘制设备的设备空间之间执行必要的转换。虽然显示器的坐标系统和打印机的坐标系统有很大的差别,但这些差别对应用程序并无影响。

 

相关标签: 读书 算法