1.EMF和Word
在學校的時候,我思考過一個問題,論文中的插圖如何保證清晰度。關鍵之一就是使用矢量圖。參考知乎問題:如何在論文中畫出漂亮的插圖?。常見的矢量圖包括:EPS,EMF和SVG。SVG適合於瀏覽器,EPS適合於LaTeX,EMF才適合Word。所以,如果在Word插圖,最好是使用EMF格式。常見的軟件如Origin Pro,Mathematica , GNUPlot , Matlab以及R均可以將圖形導出為EMF。其中MATLAB在新版之前,導出的圖形質量一直不太好。而Origin Pro的圖形質量應該是最好的。
下面的程序演示了圖形軟件將生成的EMF數據復制到剪切板的過程:
1 //請復制到MSPaint或Word查看。 2 #include <windows.h> 3 #include <stdio.h> 4 #include <stdlib.h> 5 #define Random (rand()%256) 6 void DrawEMF(HDC hdc) 7 { 8 RECT rect; 9 static HFONT hFont; 10 int h=24; 11 hFont=CreateFont(h,0,0,0,0,0,0,0,1,0,0,0,0,"Consolas"); 12 SelectObject(hdc,hFont); 13 char string[]="Hello World!\n你好,世界!Hello World!\n你好,世界!Hello World!\n你好,世界!Hello World!\n你好,世界!"; 14 for(int i=0; i<640/h; i++) { 15 SetTextColor(hdc,RGB(Random,Random,Random)); 16 TextOut(hdc,0,i*h,string,strlen(string)); 17 } 18 } 19 int main() 20 { 21 //像素點的寬和高 22 int width = 1000; 23 int height = 640; 24 int cxMms, cyMms, cxPix, cyPix; 25 HWND hwndClient=GetDesktopWindow(); 26 HDC hdc = GetDC(hwndClient); 27 cxMms = GetDeviceCaps (hdc, HORZSIZE); 28 cyMms = GetDeviceCaps (hdc, VERTSIZE); 29 cxPix = GetDeviceCaps (hdc, HORZRES); 30 cyPix = GetDeviceCaps (hdc, VERTRES); 31 ReleaseDC(hwndClient, hdc); 32 // printf("%d %d %d %d\n",cxMms,cyMms,cxPix,cyPix); 33 RECT rcImg= {0,0,(width-1)*cxMms * 100 / cxPix,(height-1)*cyMms * 100 / cyPix}; 34 HDC dc = CreateEnhMetaFile(NULL, NULL, &rcImg, (LPSTR)NULL); 35 DrawEMF(dc); 36 HENHMETAFILE hemf= CloseEnhMetaFile(dc); 37 OpenClipboard(0); 38 EmptyClipboard(); 39 SetClipboardData(CF_ENHMETAFILE, hemf); 40 CloseClipboard(); 41 return 0; 42 }
使用Ctrl+V粘貼到Word上,導出PDF確認其為矢量圖,效果如圖所示:
2.EPS,PDF和SVG轉換為EMF或WMF
目前能找的方法主要有:Adobe illustrator , Inkscape , Visio。Visio可以將SVG轉換為EMF或WMF。Inkscape轉換效果一般,且在Windows下運行比較卡。
Adobe illustrator的失真度應該是最小的。不過,在Word 2016上,我碰巧到的情況是,svg用illustrator導出格式應該是emf,eps和pdf用illustrator導出格式應該是wmf,才能保證最后生成pdf不失真。對於eps和pdf而言,pdf格式對字體的支持更好,可以優先考慮生成pdf,在轉成wmf。
注:Word 2016目前已經支持SVG格式,推薦使用SVG格式。