外文翻译-译文部分SWT图像(共24页).doc
《外文翻译-译文部分SWT图像(共24页).doc》由会员分享,可在线阅读,更多相关《外文翻译-译文部分SWT图像(共24页).doc(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上浅谈SWT 图像 概要SWT的图像类能用来在GUI里显示图象。图像的最普通的来源是从标准文件形式(例如GIF,JPEG,PNG或者BMP)中下载。一些控制,包括按钮和TreeItems,能直接通过setImage方法来展示一幅图像,但是任何控制绘图的事件都允许图像从图表库中提取。SWT的ImageData 类描述制作一幅SWT 图像的原始数据并且决定了屏幕上每个坐标的象素颜色。 这篇文章展示了ImageData类和图像的正确的用法,显示如何从文件中载入图像,和怎样表现透明度,调和,动画,调节比例和光标这样的图表效应。 By Joe Winchester, IBM 20
2、03年9月10日这篇文章的第一部分介绍了颜色并且展示了一幅图像是怎样记录每个象素色值的。 简介 图像生存周期 颜色 o 索引调色板o 直接调色板 下一部分描述图像为的透明度,调和,动画和如何调节图像比例。 透明度 像 调和 o o 每个像素不同的值 应 画 最后,文章还告诉我们如何应用源映像和面具来在图像中创建光标。 光标 平台光标 标 简介 建立一幅SWT 图像的最简单的方法是从公认的图表文件形式中下载它。这包括GIF,BMP(Windows 形式bitmap) ,JPG 和PNG。在最近发布的Eclipse中TIFF形式得到更多的支持。 图像可以从应用建有图像的文件系统中已知的位置载入(D
3、isplay display, String fileLocation): Image image = new Image(display, C:/eclipse/eclipse/plugins/org.eclipse.platform_2.0.2/eclipse_lg.gif); 不需要费力编码图像的位置,我们通常从规定的相关类中有关的文件夹位置载入图像。这是通过建立输出流时指定文件路径来完成的 Class.getResourceAsStream(String name) ,然后使用结果作为建造者建图像的理由(Display display, InputStream inputStream)
4、。下面的Eclipse 包explorer 展示了com.foo.ShellWithButtonShowingEclipseLogo 和 eclipse_lg.gif在同一个文件夹里。为遵循代码将会从相关类位置下载图像。Image image = new Image(display, ShellWithButtonShowingEclipseLogo.class.getResourceAsStream(eclipse_lg.gif); 一旦图像被创建,它就被用作了控制的一部分,例如按钮和标签,它们能使图表成为其 setImage(Image image) 方法的一部分。 Button butt
5、on = new Button(shell,SWT.PUSH);button.setImage(image); 我们可以用已建的GC(Drawable drawable)图像库来绘图:GC gc = new GC(image);gc.setForeground(display.getSystemColor(SWT.COLOR_WHITE);gc.drawText(Ive been drawn on,0,0,true);gc.dispose(); 用 GC 来绘制图像会永久改变图像。文章中还有更多的关于如何使用GC的信息。详见 图像生存周期载入图像时,第一步是创造独立的ImageData类,用o
6、rg.eclipse.swt.graphics.ImageData来描述。接下来,数据通过创造一个实际图像实例为一个具体的设备作准备。 当从一个文件直接载入一幅图像时,可以单独建立一个ImageData 对象,然后使用Image(Device device, ImageData imageData)建图像。尽管不是用来被创建图像的相同对象,但是我们可以使用getImageData()方法来取回数据。这是因为当你准备在屏幕上绘制一个图像时比如颜色深度这类属性是不同于最初的图象数据的。 图像的实例是为一个具体的设备作准备的一种基础的资源,当分配资源不再免费时,这些实例就会被处理掉。在SWT中,当一
7、个对象被垃圾站回收时资源是没有最终化的。更多的信息详见 ImageDataImageData可以被认为是一幅图像的模型,而图像是准备输出一个具体的设备时的映像。 ImageData包括宽度,高度和每个坐标的象素值。图像的初始数据是字节 ,图像的深度指坐标的比特值。1位图像深度可以为每个象素(0和1)储存两个可能值, 4位深度能储存2 4 = 16,8位深度能储存2 8 = 256值,24位深度能为每个像素储存224=1600万不同的值。图像的深度越大像素所需要的字节数越多,而有些文件形式,比如GIF格式,为了通过链接因特网下载图片最初设计只支持最大为8位的图像深度。每个象素值是怎样转化为一种实
8、际颜色的,这取决于类的调色板org.eclipse.swt.graphics.PaletteData.。 下一部分讲解如何用RGB值来表达颜色,和怎样用PaletteData来给每个象素设定特定颜色。 颜色类org.eclipse.swt.graphics.Color是用来管理实现RGB颜色模型的资源。每种颜色由红色,绿色和蓝色三色素(每个都表示没有任何颜色0到全色255之间的一个整数值)组成。Color cyanColor = new Color(display,0,255,255);/ . Code to use the ColorcyanColor.dispose(); SWT中存在一个
9、便节类org.eclipse.swt.graphics.RGB把红色,绿色和蓝色结合于一个单个的对象内。 RGB cyanRGB = new RGB(0,255,255);Color cyanColor = new Color(display,cyanRGB);/ . Code to use the ColorcyanColor.dispose(); 当不再需要颜色实例时,颜色实例会被处理掉。然而RGB并没有必要被处理。这与图像和它的ImageData之间的关系类似,颜色和图像是对象使用自身基础资源的设备,而RGB和ImageData是基础模型数据。 避免创建管理通常使用的颜色实例,显示类可以
10、使用方法Display.getSystemColor(int id). Color cyanColor = display.getSystemColor(SWT.COLOR_CYAN) 来返回。当一个SWT 程序用Display.getSystemColor(int id)来获得颜色时,颜色不能被处理掉。这个经验法则适合任何SWT 资源:“谁创建,谁处理”。 由上面的原则返回cyan颜色实例,因为没有明确地建立过,所以也不应该被随便处理掉。 一种颜色是如何确切呈现在显示器上的,这是由比如显示器深度解决办法等这类因素决定的。 更多关于这个和SWT颜色模型的问题详见。PaletteData有两种P
11、aletteData,一个索引调色板,一个直接调色板。 PaletteData是一个象素值绘制RGB值的模型,因为调色板不代表基础资源,它们也不需要被处理。 索引调色板 索引调色板中每个像素值代表一个数值,然后通过索引调色板来决定实际颜色。可允许索引的的象素值范围大小不超过该图像的深度。 下面的例子是创建一个深度为1位,48*48 的正方形图像和一个索引调色板。索引调色板指定 0 是红色 1是绿色 (根据建造者 RGB 的指令)。ImageDatas 非预置的像素值初始值为 0 (红色), 2个为环 在ImageData的中央设置一个34*34的正方形图像,设定1 (绿色)。PaletteDa
12、ta paletteData = new PaletteData( new RGB new RGB(255,0,0), new RGB(0,255,0); ImageData imageData = new ImageData(48,48,1,paletteData);for(int x=11;x35;x+) for(int y=11;y35;y+) imageData.setPixel(x,y,1); Image image = new Image(display,imageData); 上述例子深度为1位,因此可以储存2种颜色。当图像颜色深度增加时,调色板颜色数量同时增加。索引调色板允许的
13、图像深度为1,2,4,8位,深度为8位时可以提供 28 = 256 种可能的颜色。还需要更高的颜色深度时(例如16,24,或者32) ,就必须使用直接调色板。 直接调色板 不像在索引调色板中,每个像素值对应着调色板索引中的一个颜色,直接调色板允许每个象素值直接记录红,绿和蓝三色素的组成。直接PaletteData 定义了红色,绿色和蓝色面罩。我们把像素值移至左以使面罩的高位与颜色首字节的高位一致,这个过程要求的比特值数就是面罩数量。例如,一24 位直接调色板可分成3部份,低8位用来储存红色,中间的8位储存绿色,而高8 位则储存蓝色。红色的移动面罩是0 xFF,绿色是0 xFF00 而蓝色是0
14、xFF0000。每个象素值都是24位整数中红色,绿色和蓝色的组合。建立一个索引调色板使用允许红色,绿色,蓝色面罩被详细说明PaletteData palette = new PaletteData(0xFF , 0xFF00 , 0xFF0000); ImageData imageData = new ImageData(48,48,24,palette); 用之前同样的知识, 代码反复说明了放置到两者中任何一个的像素坐标。0xFF (for red) or 0xFF00 (for green). for (int x=0;x48;x+) for(int y=0;y 11 & y 11 & x
15、 操作符来移动颜色组成部分到右侧。如果你正在编写一般代码做这种操作,注意直接调色板中深度24位或32位的颜色用低位存储红色组成部分,而深度16位的颜色相反,红色占高位蓝色占低位。这个原因同Windows内部储存图像,这样创建图像时,几乎没有变换。 imageData中会反复强调两个为环。 第一个是从上到下横穿图像一次,然后 创建一个 int 来容纳每条数据线。用方法 ImageData.getPixels(int x, int y, int getWidth, int pixels, int startIndex) 每次从imageData的字节中选择一条线。这个方法的API有些不规则,因为与
16、其返回数据结果不如声明为空,结果像素数据加入 int 作为方法讨论通过。 像素的int 被反复调用而且每个值都有自己的红色, 绿色和蓝色组成部分被选出。我们希望的是可以判断是否该像素是返白色,如果是就把它转变成纯白色 - 假设所有像素的红绿组成都高于230,这是一个非常好用的规则蓝色组成部分高于150就是返白色int lineData = new intideaImageData.width; for (int y = 0; y ideaImageData.height; y+) ideaImageData.getPixels(0,y,width,lineData,0); / Analyze
17、each pixel value in the line for (int x=0; x 8; int b = (pixelValue & blueShift) 16; if (r 230 & g 230 & b 150) ideaImageData.setPixel(x,y,0xFFFFFF); ; 已经操作构成ImageData的未加工的字节,我们现在已经成功把返白色值改变成纯白色。 保存图像现在既然有了ImageData,其中所有带白色象素都变为白色,并且调色板的透明度象素已经被设置为白色,我们将保存这幅图像,以便下次某个SWT程序需要纯白色的JPF时,可以直接载入文件照原样使用它。将I
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 外文 翻译 译文 部分 SWT 图像 24
限制150内