虚拟打印的实现-EMF转换成BMP
生活随笔
收集整理的這篇文章主要介紹了
虚拟打印的实现-EMF转换成BMP
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
通過上兩次的介紹我們可以得到一個打印任務的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文件網上有很多的代碼,大家搜一下就知道了。 到現在為止,一個虛擬打印的編程部分已經完成了。但是如何將這個虛擬打印安裝到系統中,讓它真正的運行起來呢?下次我將會寫關于如何安裝這個虛擬打印的方法。
?
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文件網上有很多的代碼,大家搜一下就知道了。 到現在為止,一個虛擬打印的編程部分已經完成了。但是如何將這個虛擬打印安裝到系統中,讓它真正的運行起來呢?下次我將會寫關于如何安裝這個虛擬打印的方法。
?
轉載于:https://blog.51cto.com/fxh7622/50182
總結
以上是生活随笔為你收集整理的虚拟打印的实现-EMF转换成BMP的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将枚举类型的数据绑定到控件
- 下一篇: Discuz论坛架设从零起步之二