您的位置:网站首页 > Java工具 > 正文

标准窗口小部件工具箱的 Java 二维作图

类别:Java工具 日期:2018-3-7 18:03:53 人气: 来源:

  SWT (标准窗口小部件工具箱,Standard Widget Toolkit)是在 Eclipse 平台上使用的窗口小部件工具箱。它也可以作为 Swing/AWT 的一个重要替代产品,用于构建任何类型的 Java GUI 应用程序。随着 Eclipse 平台在过去两年里的日趋流行,SWT 已经进入大家的视线,并且最近它已经开始在一些应用程序中取代 Swing/AWT。SWT 的流行源自这样一个事实:它是跨平台的工具箱,利用了窗口小部件的本性,并有一个与 Swing 及其他现代工具箱同样强大的功能。使用 SWT,就不用在可移植性、功能和性能之间做取舍了。

  事实上,Swing/AWT 只在一个方面明显强于 SWT,这就是 Java 2D。Java 2D 是一个强大的 API,是在 JDK 1.2 中引入的。它使 Java 开发人员在 AWT 组件上绘制时可以使用复杂的二维变换(平移、旋转、缩放、错切等)。不幸的是,Java 2D 设计为只在 AWT 或者 Swing 工具箱上使用,而 SWT 还没有提供这种扩展的二维能力。因此,许多开发人员发现他们必须选择是在 Java 平台上使用 Java 2D 还是放弃它令人兴奋的功能而使用 SWT。

  不过,在本文中您将了解到如何同时拥有这两方面的好处。我将展示一个简单的技术,利用该技术可以在 SWT 组件和 Draw2D 图像上绘制 Java 2D 图像。为了理解这个例子,读者应当熟悉 Java 2D、AWT 和 SWT。具有一些 Eclipse 平台的 GEF(图形编辑框架,Graphical Editing Framework)的经验也是有帮助的。

  本文展示一种简单的技术,利用该技术,您可以用 Java 2D 功能在任何 SWT 窗口小部件或者 Draw2D 图像上绘制。为了弥补 SWT 上缺少 Java 2D 的不足,用一个屏外(offscreen)AWT 图像接收 Java 2D 绘制操作,并将它们转换为于工具箱的像素值。再用另一个由 SWT 工具箱创建的 屏外图像将这些像素信息绘制在任何 SWT 组件上。图 1 显示了 AWT 屏外图像转换为 SWT 图像再绘制在 SWT 窗口小部件上的过程。

  图 1 中显示的屏外 AWT 图像被初始化为透明背景。然后对屏外图像的图形上下文调用 Java 2D 方法。像所有 AWT 图像一样,屏外图像的图形上下文自动支持 Java 2D。完成了所有特定于 Java 2D 的绘制后,提取 AWT 图像的像素值并传送到一个屏外 SWT 图像中。然后用工具箱的 GC.drawImage(...) 方法在 SWT 组件上绘制这个 SWT 图像,就像所有正常图像一样。

  TYPE_BYTE_INDEXED :这种图像类型的图像将使用一个索引颜色模型。 索引颜色模型的意思是图像中使用的每一种颜色都是在一组颜色中索引的。像素值只包含这个像素的颜色在颜色模型中的索引。这种类型的图像局限于 256 种颜色 也就是颜色模型的大小。以这种方式存储像素信息可以很紧凑地表示图像,因为每一个像素都只用一个字节编码。

  TYPE_INT_RGB :这种类型常量表明图像使用直接颜色模型。 直接颜色模型 的意思是每一个像素的值包含关于其颜色的完整信息。 TYPE_INT_RGB 表明每一个像素都是用一个整数(四字节)编码的。每一个像素中编码的信息是这个像素所使用的颜色的红、绿和蓝(RGB)成分。每一种颜色成分都用一个字节编码。因为整个像素值是用四个字节编码的,所以有一个字节是未使用的。这种图像的内部表示占用的内存是使用索引颜色模型的图像的四倍,但是这种图像可以使用的颜色数增加到了 1 百 60 万(256 x 256 x 256)。

  TYPE_INT_ARGB :与 TYPE_INT_RGB 一样,这种类型的图像使用直接颜色模型并用四个字节编码每一个像素。不同之处在于,这里用 TYPE_INT_RGB 没有使用的第四个字节表示像素的透明度,有时也称为颜色的 alpha 成分。这种类型的图像可以有透明的背景,也可以是半透明的。

  为了让屏外图像技术可以工作,需要只将受到 Java 2D 绘制影响的像素传送到 SWT 组件的表面。为了这一点,初始图像必须有透明背景。因此,对于 AWT 屏外图像,使用的缓冲图像类型为 TYPE_INT_ARGB 。

  scansize 是图像中相邻两行中具有相同行索引的像素的索引偏移值。如果这个值与要提取的区域的宽度相同,那么一行的第一个像素就会存储在数组中前一行最后一个像素后面的索引。如果这个值大于提取区域的宽度,那么数组中,在一行最后和下一行开始之间就会有一些未使用的索引。

  图 2 显示 BufferedImage.getRGB(...) 如何在提取了 AWT 图像的矩形区域后填充整数缓冲区。图中下面的部分表示整数缓冲区。每一个框表示缓冲区中包含一个像素 4 字节 ARBG 值的一个值。括号中的数字表示像素在图像中的坐标。

  在这种情况下,不使用任何 offset ,这意味着第一个像素将保存在缓冲区索引 0 的。 scansize 的值取要提取的区域的宽度,这意味着提取的一行中的第一个像素会接着前一行的最后一个像素的缓冲区。使用这些参数,整数的缓冲区就一定会足够大,可以包含 w*h 个整数。

  当每一个像素的颜色信息都存储到了一个整数的简单缓冲区后,就可以将这些信息传输到 SWT 屏外图像中。

  SWT Image 类似于 AWT BufferedImage ,因为它的像素数据可以有直接读或者写操作访问。这意味着可以通过直接读取或者修改图像的数据,来设置或者取得图像中任何像素或者任何一组像素的颜色值。不过, SWT API 与相应的 AWT API 有很大不同,并且更容易使用。

  通过将一个文件名或者一个 InputStream 作为参数传递给构造函数装载一个现有的图像。图像的格式必须是所支持的格式之一:BMP、GIF、JPG、PNG、Windows ICO 等。

  构造一个指定大小的空图像。可以通过修改其像素值或者向它拷贝一个 SWT 图形上下文的内容 ( GC ) 来绘制该图像。

  有关图像的像素数据的信息包含在它的 ImageData 中。 ImageData 是一个包含有关图像大小、调色板、颜色值和透明度信息的类。应当特别关注以下 ImageData 字段:

  depth指定图像的颜色深度。可能的值为 1、2、4、8、16、24 或者 32,指定编码每一个像素的值所使用的位数。

  palette 包含一个 PaletteData 对象,它存储有关图像的颜色模型的信息。与 AWT 一样,SWT 的颜色模型可以是索引或者直接的。如果颜色模型是索引的,那么 PaletteData 包含颜色索引。如果它是直接的,那么它包含转换(shift)信息,表明应当如何从像素的整数值中提取出颜色的 RGB 成分。

  data包含包含有像素值的字节缓冲区。与 AWT 缓冲区不同,SWT 缓冲区不是包含每一个像素的一种颜色值的整数数组。相反,它包含字节值。字节编码的方法取决于所使用的颜色深度。对于一个 8 位的图像,数组中的一个字节正好表示图像中一个像素的值。对于 16 位图像,每一个像素值编码为缓冲区中的两个字节。这两个字节以最低有效字节顺序存储。对于 24 或者 32 位图像,每一个像素值以最高有效位字节顺序编码为缓冲区中的三个或者四个字节。

  我们将使用带有一个透明度颜色信道的 24 位图像。图像中的每一个像素都编码为数组中的三个字节,顺序为红、绿和蓝成分。

  知道了图像数据就可以容易地将 AWT 图像转换为 SWT 图像。只要将(由 AWT 图像利用 getRGB(...) 返回的)整数缓冲区转换为 SWT 图像所使用的字节缓冲。图 3 显示了在 SWT 图像的缓冲区中这些值是如何存储的。

  如图 2 中一样,上图中下面的部分显示了图像缓冲区的内部表示。括号中的数字显示在缓冲区中表示其颜色值的那个像素的坐标。

  尽管每一个像素都用三个字节编码,但是对于 24 位图像,缓冲区中一行像素的大小并不总是 3*width 。缓冲区中两行像素之间可能有一些索引未使用。要知道图像中每一行像素真正使用了多少字节(这样就可知道缓冲区中下一行从哪个索引开始),必须使用 ImageData 字段的 bytesPerLine 值。

  

关键词:java小工具
0
0
0
0
0
0
0
0
下一篇:没有资料

相关阅读

网友评论 ()条 查看

姓名: 验证码: 看不清楚,换一个

推荐文章更多

热门图文更多

最新文章更多

关于联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助

郑重声明:本站资源来源网络 如果侵犯了你的利益请联系站长删除

CopyRight 2010-2012 技术支持 FXT All Rights Reserved