用Delphi进行word开发

使用以CreateOleObjects方式调用Word

实际上还是Ole,但是这种方式能够真正做到完全控制Word文件,能够使用Word的所有属性,包括自己编写的VBA宏代码。
-----------------------------------------

Word宏编辑器
Word能够真正地进行VBA代码的编辑,可以编写窗体、函数。
进入Word宏编辑器的方法:工具->宏->Visual Basic编辑器,可进入Visual Basic编辑器界面。Word的Visual Basic编辑器界面和真正的Visual Basic编辑器基本相同,在此不再向详述。在VBA代码中,可以添加用户窗体、模块、类模块。用户窗体、模块、类模块的概念和Visual Basic完全相同。注释也与Visual Basic完全相同。
可以将光标停留在窗体、模块的任何一个子程序上,直接按“F5”运行当前子程序。

四、Word的宏的概述
Word充分地将文档编辑和VB结合起来,真正地实现文档的自动化。使用Word编程,类似于使用Visual Basic,所不同的是,在Word中,能够直接运行某一个子程序,直接看见结果,Word的宏,只能解释运行,而Visual Basic,现在已经能够编写成真正的机器码,从代码的保护上来说,应该尽可能地减少Word的VBA代码数量,尤其是关键的代码。
VBA宏,可分成四种:
1、和命令名相同的宏
如FileSave,FileOpen,如果在VBA代码中包含与Word同名的函数,则直接执行这些VBA代码,忽略Word本身的命令。
2、Word内特定的宏
这些宏包含AutoExec(启动 Word 或加载全局模板)、AutoNew(每次新建文档时)、AutoOpen(每次打开已有文档时)、AutoClose(每次关闭文档时),AutoExit(退出 Word 或卸载全局模板时)。
如果VBA代码中含有这些名称的函数,则满足相应的条件,相应代码就自动执行。
3、相应事件的VBA宏
这些宏是由事件触发的宏,如Document_Close在文档关闭的时候触发事件,Document_New在新建文档的时候触发,Document_Open在打开文档的时候触发。
4、独立的宏
自己编写的VBA代码,即不属于上面几种情况的VBA代码,可以被其他VBA代码调用,更重要的是,可以被其他程序调用。
这样,我们就可以屏弃Word自动执行的宏,通过Delphi直接调用相应宏来达到目的。
[b]五、Word命令宏的详细描述[/b]
Word本身的命令函数包含很多,但是无论是word联机帮助还是MSDN帮助,都没有这方面的介绍,因此只能凭自己的实验取探索,初步探测的函数如下:
宏名 解释 注释
FileNew 新建 
FileNewDefault 新建空白文档 
FileSaveAs 另存为 
FileOpen 打开 
FileClose 关闭 
FilePrint 打印 
FilePrintPreview 打印预览 
ToolsCustomize 工具栏里面的自定义 
ToolsOptions 工具选项 
ToolsRevisions 突出显示修订 
ToolsReviewRevisions 接受或拒绝修订 
ToolsRevisionMarksAccept 接受修订 
ToolsRevisionMarksReject 拒绝修订 
ToolsRevisionMarksToggle 修订 
ToolsMacro 宏 
ToolsRecordMacroToggle 录制新宏 
ViewSecurity 安全性 
ViewVBCode 查看VB编辑器环境 
FileTemplates 模板和可加载项 
ToolsProtectUnprotectDocument 解除对文档的保护 
InsertHyperlink 插入超级链接 
EditHyperlink 编辑超级链接 
DeleteHyperlink 删除超级链接 
EditLinks 查看、删除链接 
EditPasteAsHyperlink 粘贴超级链接 
FormatStyle 样式 
EditBookMark 书签

OleWord时一些用用的代码

一、Delphi程序启动Word
采用CreateOleObjects的方法来启动Word,调用VBA代码,具体实现过程为:
首先使用GetActiveOleObject('Word.Application')判断当前内存中是否存在Word程序,如果存在,则直接连接,如果没有Word程序,则使用CreateOleObject('Word.Application')启动Word

二、Delphi程序新建Word文稿
格式:WordDocuments.Add(Template,NewTemplate,DocumentType,Visible)
Template: 使用模板的名称,
NewTemplate: 新建文档的类型,True表示为模板,False表示为文档
DocumentType: 文档类型,默认为空白文档
Visible: 打捞的窗口是否可见

举例:Doc_Handle:=Word_Ole.Documents.Add(Template:='C:\Temlate.dot',NewTemplate:=False);

三、Delphi程序打开Word文稿
格式:WordDocuments.Open(FileName,ConfirmConversions,ReadOnly,PassWordDocument,
PasswordTemplate,Revent,WritePasswordDocument,WritePassWordTemplate,
Format,Encoding,Visible)

FileName: 文档名(包含路径)
Confirmconversions: 是否显示文件转换对话框
ReadOnly: 是否以只读方式打开文档
AddToRecentFiles: 是否将文件添加到"文件"菜单底部的最近使用文件列表中
PassWordDocument: 打开此文档时所需要的密码
PasswordTemplate: 打开此模板时所需要的密码
Revert: 如果文档已经,是否重新打开文档
WritePasswordDocument: 保存对文档更改时所需要的密码
WritePasswordTemplate: 保存对模板进行更改时所需要的密码
Format: 打开文档时所需使用的文件转换器
Encoding: 所使用的文档代码页
Visible: 打开文档的窗口是否可见

举例:
Doc_Handle:=Word_Ole.Documents.open(FileName:=Doc_File,ReadOnly:=False,
AddToRecentFiles:=False);

四、Delphi程序保存Word文稿
格式:WordDocuments.SaveAs(FileName, FileFormat, LockComments, Password,
AddToRecentFiles, WritePassword, ReadOnlyRecommended, 
EmbedTrueTypeFonts, SaveNativePictureFormat, SaveFormsData, 
SaveAsAOCELetter)

FileName: 文件名。默认为当前文件夹和文件名。
FileFormat 文档保存的格式。
LockComments 如果为 True,则此文档只允许进行批注。
Password 打开文档时的口令。
AddToRecentFiles 如果为True,则将文档添至"文件"菜单中最近使用的文档列表中。
WritePassword 保存对文档的修改所需的口令。
ReadOnlyRecommended 如果为 True,在每次打开文档时,Word 将建议用户采用只读方式。
EmbedTrueTypeFonts 如果为 True,则将文档与 TrueType 字体一起保存。
SaveNativePictureFormat 如果为 True,则从其他系统平台(例如 Macintosh)导入的图形仅保存其 Windows 版本。
SaveFormsData 如果为 True,则将窗体中用户输入的数据存为一条数据记录。
SaveAsAOCELetter 如果文档包含一个附加,当此属性值为 True 时,将文档存为一篇 AOCE 信笺(同时保存邮件)。

举例:
Word_Ole.Documents.SaveAs(FileName:=Doc_File,FileFormat=wdFormatDocument,
AddToRecentFiles=False);

五、从数据库读取文件到本地硬盘和从本地硬盘读取文件到数据库

在数据库上使用Image二进制字段保存,使用Stream流的方式。

创建文件流:
Word_FileStream:=TFileStream.Create(Target_Name,fmOpenWrite or fmCreate);
Word_FileStream.Position:=0;

保存到数据库的Image字段:
TBlobField(AdoQuery1.FieldByName(Column_Name)).SaveToStream(Word_FileStream);

从数据库读取文件到本地硬盘:
TBlobField(ADOQuery1.FieldByName(Column_Name)).loadfromStream(Word_FileStream);

释放文件流:
Word_FileStream.Free;

六、全局消息的定义
因为word和Delphi程序是两个软件,相互之间通讯比较麻烦,所以使用全局消息的方法进行。全局消息必须首先注册,Windows返回系统空闲的消息号,当注册的消息相同时,Windows系统返回同一个值,这样就保证了使用这个消息号在两个程序之间通讯。

定义消息的办法:
szMessageString: pchar = 'XIDIAN_11_Stone';
FMyJoinMessage := RegisterWindowMessage(szMessageString);

发送消息的方法:
SendMessage(对方句柄,消息,消息附带短变量,消息附带长变量)

七、Delphi程序接收消息的方法
Delphi接收消息有两种,一是重载特定消息,二是重载WndProc函数,在里面选择相应消息进行处理。
法一,每次只能处理一条消息,而法二能够同时处理多条消息。

对于法二,声明如下:
procedure WndProc(var Message: Tmessage);override
必须注意,使用时需要在处理完自己消息处理后继承WndProc(Message)函数,否则系统会崩溃!

八、Word中Combo对话框的动态生成以及Change事件
建立类模块Combohander,在内部定义事件
Public WithEvents ComboBoxEvent As Office.CommandBarComboBox

定义Combo控件产生事件的模块
Dim ctlComboBoxHandler As New ComboBoxHandler

产生Combo对话框
Set Cbo_ChooseDoc = CommandBars("添加的菜单").Controls.Add(Type:=msoControlComboBox, Temporary:=True)

进行文件句柄设置,以产生Combo_Change事件
Set ctlComboBoxHandler.ComboBoxEvent = Cbo_ChooseDoc

产生事件后,在类模块Combohander内选择ComboBoxEvent的Change事件,即可书写事件代码
Sub ComboBoxEvent_Change(ByVal Ctrl As Office.CommandBarComboBox)

九、一些Word的事件
VBA代码中处理的Word事件有:Document_Close
Application事件中需要处理的有:DocumentBeforeClose,DocumentChange。

Document_Close:事件在文档关闭时产生事件
DocumentBeforeClose:在文档被关闭以前先于Word判断文档是否保存,给出相应提示并进行相应处理。
DocumentChange:文档切换,在文档从自己修改的文稿和其他人修改的文稿之间切换产生事件,主要处理设置文档权限等

------------------------------

实例

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtnrs,comobj, Word2000, OleServer;

type
  TForm1 = class(TForm)
    OleContainer1: TOleContainer;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var 
FWord :Variant; 
FDoc :Variant; 
strSQL :string;
begin
//首先创造对象,如果出现异常就做出提示
try
FWord := CreateOleObject('Word.Application');
//WOrd程序的执行是否可见,值为false时,程序在后台运行。
FWord.Visible := True;
except
messagebox(0,'创建word对象失败!','警告',MB_OK+MB_ICONINFORMATION);
exit;
end;

//现在打开的Word中,创建一个新的页面,然后在其中键入需要的内容
try
FDOC :=FWord.Documents.Add;
{对于Word的新页面}
FWord.Selection.Font.Name :='宋体';
FWord.Selection.Font.Size :=20; 
FWord.Selection.Font.Bold :=2; 
FWord.Selection.paragraphs.Alignment := wdAlignParagraphCenter;
FWord.Selection.TypeText(' 新夏旅游减肥 ');
FWord.Selection.Typeparagraph;//换行
FWord.Selection.Typeparagraph;//换行
FWord.Selection.paragraphs.Alignment := wdAlignParagraphLeft;
FWord.Selection.Font.Size :=10;
FWord.Selection.Font.Bold :=0;
FWord.Selection.TypeText(' 现将我社组团部的');
FWord.Selection.TypeText(' 新夏旅游减肥 ');
FWord.Selection.TypeText('团计划发出,各地请按下列行程做接待,并及早落实'+
'团队计划和选派优秀导游员。各地代订住宿、火车票、机票务必安排好接待,日程'+ 
'如有变更,及时与下站接待社或本社联系,各地接团时请举【xxxx欢迎你】接站牌。');
FWord.Selection.Typeparagraph;//换行
FWord.Selection.Typeparagraph;//换行
FWord.Selection.TypeText('请速回传真确认,谢谢合作!');
FWord.Selection.Typeparagraph;//换行
FWord.Selection.Typeparagraph;//换行

FWord.Selection.TypeText('人数:'); 
FWord.Selection.TypeText('0');
FWord.Selection.TypeText('国籍:'); 
FWord.Selection.TypeText('I DO NOT KNOW');
FWord.Selection.TypeText('等级:'); 
FWord.Selection.TypeText('8星级');
FWord.Selection.Typeparagraph;//换行 
FWord.Selection.TypeText('这里是团队安排');
FWord.Selection.Typeparagraph;//换行
FWord.Selection.TypeText('早上:起床 然后 饿一顿--->减肥');
FWord.Selection.Typeparagraph;//换行
FWord.Selection.TypeText('中午:运动完毕 然后 饿一顿--->减肥');
FWord.Selection.Typeparagraph;//换行
FWord.Selection.TypeText('晚上:自己搭车回家 然后 请 饿一顿--->未饿死的减肥成功!');
FWord.Selection.Typeparagraph;//换行 
FWord.Selection.TypeText('TO: ');
FWord.Selection.TypeText('12345678901234567890'); 
FWord.Selection.Typeparagraph;//换行 
FWord.Selection.TypeText('TEL: '); 
FWord.Selection.TypeText('12345678901234567890'); 
FWord.Selection.Typeparagraph;//换行
FWord.Selection.TypeText('FAX: ');
FWord.Selection.TypeText('12345678901234567890'); 
FWord.Selection.Typeparagraph;//换行 
FWord.Selection.Typeparagraph;//换行 
FWord.Selection.TypeText('______________________________________________');
FWord.Selection.Typeparagraph;//换行 
FWord.Selection.Typeparagraph;//换行 
FWord.Selection.TypeText('FROM: '); 
FWord.Selection.TypeText('中国XXXX地');
FWord.Selection.Typeparagraph;//换行 
FWord.Selection.TypeText('TEL: '); 
FWord.Selection.TypeText('久动久动久不动');
FWord.Selection.Typeparagraph;//换行 
FWord.Selection.TypeText('FAX: ');
FWord.Selection.TypeText('你猜你猜你猜猜猜');
FWord.Selection.Typeparagraph;//换行

Except 
on e: Exception do 
Messagebox(0,Pchar(e.Message),'警告',MB_OK+MB_ICONINFORMATION); 
end; 
//保存文档 
FWord.Caption := '组团计划保存在: '+ExtractFilePath(application.ExeName)+'Reports\GroupPlan.doc'; 
FDOC.SaveAS('d:\GroupPlan.doc');
if messagebox(0,'组团计划已经保存成功!'+chr(13)+chr(13)+
'单击【确定】退出Word,返回到程序中!','您确信要退出Word吗?', 
MB_YESNO+MB_ICONINFORMATION+MB_DEFBUTTON2)=IDYES then 
begin
FWord.Quit; 
FWord := Unassigned; 
end;

//刷新ole显示
OleContainer1.CreateObjectFromFile('d:\GroupPlan.doc',false);
OleContainer1.DoVerb(ovShow);
form1.Height:=form1.Height+30;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  APPLICATION.Terminate;
end;

end.

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.所需的三个控件: ChooseWA: TWordApplication; ChooseWD: TWordDocument; ChooseWF: TWordFont; 2.检查计算机是否安装了WORD try ChooseWA.Connect; except MessageBox(handle,'无法链接,请确认电脑上是否安装Word XP/2003及以上版本','连接出错', MB_Ok or MB_ICONERROR); Abort; end; 3.关闭WORD拼写检查 //因为Word进行拼写检查需要很多时间,所以首先关闭检查 ChooseWA.Options.CheckSpellingAsYouType := False; ChooseWA.Options.CheckGrammarAsYouType := False; 4.新建一个文档并设置文档的标题 var NewDocument: _Document; ItemIndex: OleVariant; ItemIndex := 1; NewDocument := ChooseWA.Documents.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam); ChooseWD.ConnectTo(NewDocument); ChooseWD.Windows.Item(ItemIndex).Caption := '我新建的第一个文档';//此文档的第一个窗口的标题,试卷 名称 5.写入数据 ChooseWD.Range.InsertAfter('第一行数据'+#13);//#13代表换行 6.设置字体格式 procedure SetFont(aBold,aItalic,aShadow,aSize:integer); begin ChooseWF.ConnectTo(ChooseWD.Sentences.Get_Last.Font); ChooseWF.Name := '宋体'; ChooseWF.Bold := aBold; ChooseWF.Italic := aItalic; ChooseWF.Shadow := aShadow; ChooseWF.Size := aSize; end; 如:SetFont(1,0,0,22);//设置字体为22号 7.向WORD中写入表格 (1)插入表格: ChooseWD.Tables.Add(ChooseWD.Words.Last, RowNum, ColNum,EmptyParam,EmptyParam);//RowNum为行数, ColNum为列数 (2)插入数据: ChooseWD.Tables.Item(1).Cell(1,1).Range.Text := '第一行第一列'; ChooseWD.Tables.Item(1).Cell(2,1).Range.Text := '第二行第一列'; 8.向WORD写入图片 var Img: TImage; MyFormat: Word; AData: Cardinal; APalette: HPALETTE; Img.Picture.LoadFromFile('文件路径');//从文件夹中导入图片至控件 Img.Picture.SaveToClipboardFormat(MyFormat,AData,APalette);//将图片转存到剪贴板中 Clipboard.SetAsHandle(MyFormat,AData);//将剪贴板中的图片复制出来,注意添加Clipbrd单元 ChooseWD.Sentences.Last.Paste;//在WORD中粘贴图片 9.在界面中显示WORD文档 ChooseWA.Visible:=true; 10.断开与WORD的链接 ChooseWA.Disconnect; ChooseWD.Disconnect; Chart1.SaveToBitmapFile(‘文件名.bmp’);
使用DELHPI的设计与编程来实现与WORD的结合,达到控制的目的。 您不必从文件中读取所有的图像 ? 您可以创建自己的图像。要创建自己的图像,最灵活的方法是用一个 BufferedImage 对象,它是 Image 类的一个子类,它把图像数据存储在一个可以被访问的缓冲区中。它还支持各种存储像素数据的方法:使用或不使用 alpha 通道、不同种类的颜色模型以及颜色组件的各种精确度。ColorModel 类提供一种灵活的方法定义各种颜色模型,以和 BufferedImage 对象一起使用。为了理解颜色模型工作的基本知识,我们将只使用一个缺省的颜色模型,其颜色组件由 RGB 值和一个缓冲类型(存储 8 位的 RGB 颜色值加上一个 alpha 通道)组成。这一缓冲类型由 BufferedImage 类中的常量 TYPE_INT_ARGB 指定,它意味着每个像素要用一个 int 值。每个像素的值是以 8 位字节形式存储一个 alpha 组件加上 RGB 颜色组件。我们可以用给定的宽度和高度创建一个这种类型的 BufferedImage 对象,代码语句如下: int width = 200; int height = 300; BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_ARGB); 这段代码创建了一个 BufferedImage 对象,它代表一个 200 像素宽、300 像素高的图像。为了应用这个图像,我们需要有图形上下文,而 BufferedImage 对象createGraphics() 方法就返回一个与该图像相关的 Graphics2D 对象: int width = 200; Graphics2D g2D = image.createGraphics(); 使用 g2D 对象的操作会修改 BufferedImage 对象 image 的像素。利用这个对象,您现在完全有能力应用 BufferedImage 对象。您可以绘制形状、图像、GeneralPath 对象或任何别的东西,还可以为图形上下文设置 alpha 组合对象。您同时还拥有 Graphics2D 对象提供的全部仿射变形能力。 如果要从 BufferedImage 对象获取单个像素,可以通过调用它的 getRGB() 方法,并提供该像素的 x,y 坐标作为 int 类型的参数。这个像素会按 TYPE_INT_ARGB 格式以 int 类型返回,它由四个 8 位的值(代表 alpha 值和 RGB 颜色组件)组成一个 32 位字。同时 getRGB() 还有一个重载的版本,它从一部分图像数据中返回一个像素数组。您也可以通过调用 setRGB() 方法来设置单个像素。前两个参数是该像素的坐标值,第三个参数是待设定的值,类型为 int。这个方法也有一个版本可以设置像素数组的值。 至此我们已经完成了像素操作的学习。下面我们要建立一个 applet,它在 Wrox 徽标背景上使 BufferedImage 对象具有动画效果。我们的示例还将演示怎样能让图像局部透明。applet 的基本内容如下所示: import java.awt.*; import java.awt.image.*; import java.awt.geom.*; import javax.swing.*; public class ImageDrawDemo extends JApplet { // The init() method to initialize everything... // The start() method to start the animation... // The stop() method to stop the animation... // The ImagePanel class defining the panel displaying the animation... // Data members for the applet... } 创建一个图像 一个子图形是一个小的图形图像,可以将其绘制在静态图像以创建动画。要创建动画效果,您只要随着时间推移,在不同的位置和方向上绘制子图形。当然,利用坐标系的变形可以使之简化许多。游戏经常使用子图形 ? 由于您只需要在一个静态背景上绘制子图形,所以可以使动画所占用的处理器的时间大大减少。我们对使用 BufferedImage 对象的兴趣意味着我们将不再花费精力去研究减少处理器时间的最佳技术,而是把注意力放在理解怎样才能在一个程序内部创建和使用图像上。 我们的 BufferedImage 对象看上去如图 1 中的图像: 图 1. BufferedImage 子图形 这个图像是一个以 spriteSize 为边长的正方形。图像其它部分的尺寸值都与这个边长相关。实际上这里只有两个几何实体,一条线和一个圆,都在不同位置和方向重复出现。如果我们创建一个 Line2D.Double 对象代表线,创建一个 Ellipse2D.Double 对象代表圆,那么我们就可以通过移动用户坐标系和画这两个对象中的一个或其它的对象而画出整个图像。 如果是按真正面向对象的方法,应该定义一个类代表一个子图形,可能是作为 BufferedImage 的一个子类,但由于我们是在探索使用 BufferedImage 对象的技巧,因此用一个 createSprite() 方法来画出 BufferedImage 对象上的子图形会更适合我们的目的。因为该方法只是我们的 applet 类的一个成员,所以我们将为 applet 添加数据成员以存储任何需要的数据。您可以把我们将使用的数据成员插入到 applet 类中,如下所示: double totalAngle; // Current angular position of sprite double spriteAngle; // Rotation angle of sprite about its center ImagePanel imagePanel; // Panel to display animation BufferedImage sprite; // Stores reference to the sprite int spriteSize = 100; // Diameter of the sprite Ellipse2D.Double circle; // A circle - part of the sprite Line2D.Double line; // A line - part of the sprite // Colors used in sprite Color[] colors = {Color.red , Color.yellow, Color.green , Color.blue, Color.cyan, Color.pink , Color.magenta, Color.orange}; java.util.Timer timer; // Timer for the animation long interval = 50; // Time interval msec between repaints 这些成员的一般用途可以从注释中清楚地看到。下面我们要看一看开发代码时它们是怎样被使用的。 createSprite() 方法需要做的第一件事就是创建 BufferedImage 对象 sprite,然后我们还需要一个 Graphics2D 对象用于在 sprite 图像上绘画。下面就是完成这些操作的代码: BufferedImage createSprite(int spriteSize) { // Create image with RGB and alpha channel BufferedImage sprite = new BufferedImage(spriteSize, spriteSize, BufferedImage.TYPE_INT_ARGB); Graphics2D g2D = sprite.createGraphics(); // Context for buffered image // plus the rest of the method... } sprite 对象的宽和高的值都是 spriteSize,图像的类型为 TYPE_INT_ARGB,就是说每个像素的 alpha 值和颜色组件是以一个单独的 int 值存储的,而颜色是以 8 位的红、绿、蓝组件的形式存储的。这意味着我们的 sprite 图像将占用 40,000 字节,这只是浏览一个网页会占用的内存的很小一部分。而这并不影响网页的下载时间,因为在执行 applet 的时候,这部分内存是在本地机器上被分配的。除了作为网页本身的 HTML 文件的内容外,下载时间还取决于 applet 的 .class 文件的大小,以及在它执行时下载的图像或其它文件。 创建一个透明的背景 在 sprite 图像中,alpha 通道是很重要的,因为我们希望背景能完全透明。在绘画过程中,只有 sprite 对象本身应该是可见的,而不是整个 100×100 的矩形图像。我们可以很容易地实现这一目的,只要开始先使整个 sprite 图像区域透明(即,alpha 值为 0.0f),然后把我们想要画的图形绘制在上面,使之不透明(alpha 值为 1.0f)。以下是使整个图像透明的代码: // Clear image with transparent alpha by drawing a rectangle g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR, 0.0f)); Rectangle2D.Double rect = new Rectangle2D.Double(0,0,spriteSize,spriteSize); g2D.fill(rect); 我们首先使用 AlphaComposite 对象按照 CLEAR 规则设置 alpha 合成值,把颜色组件设置为零,又通过设置 alpha 值为 0.0f,使之透明。然后我们填充一个覆盖整个图像区域的矩形。我们不必设置颜色值,因为根据 CLEAR 规则,每个像素的前景和背景色所占成分都是零,所以这两者都不参与像素的生成。但我们仍要填充该矩形,因为这将确定被操作的图像像素。 这里,我们可以稍微了解一下怎样控制图像的质量。 着色微调 对着色操作的许多方面而言,都有一个在质量和速度间选择的问题。着色操作就像大多数事情一样 ? 质量是需要代价的,而这里的代价就是处理时间。所有的着色操作都有缺省设置,其中存在一个选择,缺省设置是特定于平台的,但您可以通过调用用于着色的 Graphics2D 对象的 setRenderingHint() 方法自己选择。虽然只有一些微调,如果您的计算机不支持与您指定的微调相对应的着色操作选项,这些微调就无法生效。 通过添加以下对 createSprite() 方法的调用,可以确保得到由我们的 alpha 合成操作可能生成的最好效果。 BufferedImage createSprite(int spriteSize) { // Create image with RGB and alpha channel BufferedImage sprite = new BufferedImage(spriteSize, spriteSize, BufferedImage.TYPE_INT_ARGB); Graphics2D g2D = sprite.createGraphics(); // Context for buffered image // Set best alpha interpolation quality g2D.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY); // Clear image with transparent alpha by drawing a rectangle g2D.setComposite(AlphaComposite.getInstance(AlphaComposite.CLEAR, 0.0f)); Rectangle2D.Double rect = new Rectangle2D.Double(0,0,spriteSize,spriteSize); g2D.fill(rect); // plus the rest of the method... } RenderingHints 类定义了多种着色微调,它们存储在一个映射集的 Graphics2D 对象里。setRenderingHint() 方法的参数是一个键以及对应的键值。在我们的代码中,第一个参数是代表 alpha 合成微调的键,第二个参数是该微调的值。该微调的其它可能的值有 VALUE_ALPHA_INTERPOLATION_DEFAULT,代表平台缺省值;以及 VALUE_ALPHA_INTERPOLATION_SPEED,代表追求速度而不是质量。 您还可以为下面的键提供微调: 键 描述 KEY_ANTIALIASING 决定是否使用抗锯齿。当着色有倾斜角度的线时,通常会得到一组阶梯式的像素排列,使这条线看上去不平滑,经常被称为 锯齿状图形。抗锯齿是一种技术,它设置有倾斜角度的线的像素亮度,以使线看起来更平滑。因此,这个微调是用来决定在着色有倾斜角度的线时是否在减少锯齿状图形上花费时间。可能的值有 VALUE_ANTIALIAS_ON, _OFF 或 _DEFAULT。 KEY_COLOR_RENDERING 控制颜色着色的方式。可能的值有 VALUE_COLOR_RENDER_SPEED, _QUALITY 或 _DEFAULT。 KEY_DITHERING 控制如何处理抖动。抖动是用一组有限的颜色合成出一个更大范围的颜色的过程,方法是给相邻像素着色以产生不在该组颜色中的新的颜色幻觉。可能的值有 VALUE_DITHER_ENABLE, _DISABLE 或 _DEFAULT。 KEY_FRACTIONALMETRICS 控制显示文本的质量。可能的值有 VALUE_FRACTIONALMETRICS_ON, _OFF 或 _DEFAULT。 KEY_INTERPOLATION 确定怎样做内插。 在对一个源图像做变形时,变形后的像素很少能够恰好对应目标像素位置。在这种情况下,每个变形后的像素的颜色值不得不由周围的像素决定。 内插就是实现上述过程。有许多可用的技术。可能的值,按处理时间从最多到最少,是 VALUE_INTERPOLATION_BICUBIC, _BILINEAR 或 _NEAREST_NEIGHBOR。 KEY_RENDERING 确定着色技术,在速度和质量之间进行权衡。可能的值有 VALUE_RENDERING_SPEED, _QUALITY 或 _DEFAULT。 KEY_TEXT_ANTIALIASING 确定对文本着色时是否抗锯齿。可能的值有 VALUE_TEXT_ANTIALIASING_ON, _OFF 或 _DEFAULT。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值