转自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
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文件网上有很多的代码,大家搜一下就知道了。
到现在为止,一个虚拟打印的编程部分已经完成了。但是如何将这个虚拟打印安装到系统中,让它真正的运行起来呢?下次我将会写关于如何安装这个虚拟打印的方法。
阅读(1432) | 评论(0) | 转发(0) |