转自http://fxh7622.blog.51cto.com/63841/50182
通过上两次的介绍我们可以得到一个打印任务的EMF文件。有了EMF文件以后再将它转换成BMP、JPG等等的类型就比较容易了。这次我就写一写如何将一个EMF文件转换成一个BMP文件。
在DELPHI中有一个类叫做TMetaFile,可以利用它来将EMF文件转换成BMP文件。具体的实现如下:
function EMFTOBMP(): Boolean;stdcall;export;//将EMF类型转换为BMP文件
var
SearchRes : TSearchRec;// 查找文件的结构
nFound, i : Integer;
Temp:Tbitmap;
EMF:TMetaFile;
reg : TRegistry;
m_DestDir:String;
m_BmpDestFile:String;
DivNum,ModNum:integer;
BmpNum,BmpWidth:Integer;//定义BMP的显示位数和显示宽度
JudgeWidth:Integer;//定义BMP图是否限制宽度
begin
//初始化BMP文件的宽和显示位数。
BmpNum:=16;
BmpWidth:=832;
JudgeWidth:=1;
nFound := FindFirst(m_DestDir+'\*.emf', faAnyFile, SearchRes);
while nFound = 0 do
begin
//转换开始将EMF文件装换成BMP文件
EMF:=TMetaFile.Create;
Temp:=Tbitmap.Create();
case BmpNum of
1:
begin
Temp.PixelFormat:=pf1bit;
end;
4:
begin
Temp.PixelFormat:=pf4bit;
end;
16:
begin
Temp.PixelFormat:=pf16bit;
end;
24:
begin
Temp.PixelFormat:=pf24bit;
end;
32:
begin
Temp.PixelFormat:=pf32bit;
end;
end;
try
EMF.LoadFromFile(m_DestDir+'\'+SearchRes.Name);
if JudgeWidth=0 then
begin
temp.Width:=emf.Width;
end
else
begin
if emf.Width<BmpWidth then
begin
DivNum:=emf.Width div 32;
ModNum:=emf.Width mod 32;
if ModNum>16 then
begin
Inc(DivNum);
end;
temp.Width:=DivNum * 32;
end
else
begin
temp.Width:=BmpWidth;
end;
end;
temp.Height:=emf.Height;
temp.Canvas.Draw(0,0,emf);
m_BmpDestFile:=Copy(SearchRes.Name,0,strlen(Pchar(SearchRes.Name))-4);
temp.SaveToFile(m_DestDir+'\'+m_BmpDestFile+'.bmp');
//删除Emf文件
DeleteFile(m_DestDir+'\'+SearchRes.Name);
finally
temp.free;
emf.free;
end;
nFound := FindNext(SearchRes);
end;
FindClose(SearchRes);
Result:=true;
end;
通过上面的代码我们可以将一个EMF文件转换成一个BMP文件。至于如何转换成JPG、GIF文件网上有很多的代码,大家搜一下就知道了。
到现在为止,一个虚拟打印的编程部分已经完成了。但是如何将这个虚拟打印安装到系统中,让它真正的运行起来呢?下次我将会写关于如何安装这个虚拟打印的方法。