iniwf

风是温柔的,雨是伤心的,云是快乐的,月是多情的,爱是迷失的,恋是醉人的,情是难忘的,天是长久的,地是永恒的

虚拟打印的实现-EMF转换成BMP

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

posted on 2009-03-18 15:06 iniwf 阅读(1276) 评论(0)  编辑 收藏 引用 所属分类: 驱动


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(2)

随笔分类

随笔档案

收藏夹

IT技术

积分与排名

最新评论

阅读排行榜

评论排行榜