從很早的版本開始MATLAB就支持對 patch、surface 等對象設定透明屬性,有些示意圖也必須使用透明的對象才能充分展示所要表達的含義。對透明對象支持最好的通用圖片格式就是 .png 了,但是 png 圖像并非矢量圖形,對于一些需要以矢量圖顯示的場合并不適用,比如某些展示超多細節的文檔需要不斷被放大放大放大,再比如許多期刊就不允許提交 png 格式的附件,只支持 .eps、.tiff、.jpeg 等。

eps (Encapsulated PostScript) 格式是被學術期刊最廣泛認可的圖片格式,其本身就是為矢量圖而設計。遺憾的是 PostScript 作為一個啥都能干的圖形學語音,居然直到現在都不支持透明度(transparency)的屬性,因此想要讓 MATLAB 中的帶透明對象圖形以 .eps 格式輸出,只能依靠一些偏門的手段來曲線救國,比如下面提到的方案就是把透明對象的表觀顏色賦給了矢量圖,讓它看起來像是透明而已。
首先明確一下目標:利用 MATLAB 生成帶有透明度屬性(FaceAlpha、EdgeAlpha 等)的圖形,將其以 .eps 格式輸出,且保留 MATLAB 中所展示的透明度特征。先用 peaks 函數生成一個曲面,令其表面透明度為50%:
s = surf(peaks(30))
set(s,'facealpha',0.5);
set(gcf,'color','none');

首先試試用自帶的 print 函數導出會得到怎樣的結果:
print E:graphic.eps -r300 -opengl
-r300 表示以 300dpi 導出,-opengl 表示使用 opengl 渲染器, -painters 渲染器不支持透明屬性所以不用試了。將這張 eps 圖片插入 Word 中,然后用 Adobe PDF 打印機默認的「高質量打印」輸出 pdf。
打開 pdf,果然不行,雖然矢量圖保留了,但是連顏色居然都沒了:(
下圖中右邊為局部放大展示,下同。


再來試一下廣受歡迎的 export_fig 函數:
export_fig E:Graphic2.eps -r300 -a2 -opengl
注意一下 export_fig 要直接輸出 eps 格式的話需要已經安裝 GhostScript 以及 GhostXPS,否則會報錯。export_fig 能保留透明效果(前提是使用 -opengl),但是已經變成了位圖,效果如下:


既然 export_fig 還可以直接輸出為 PDF,不妨試一試 PDF 能不能行得通,然后再用 GSView 轉成 eps:


仍然不對,問題跟直接輸出的 eps 一樣。想要靠 MATLAB 自帶的導出函數和 export_fig 基本是沒指望了。我搜了一下,發現不少人提倡以 .svg (Scalable Vector Graphics) 格式導出矢量圖,但是 .svg 只是網頁常見的矢量圖格式,人家期刊并不支持,還得再繞一步將 .svg 轉成 .eps。MATLAB 本身不支持 svg 的導出,所幸 FileExchange 中有人已經寫好了 plot2svg,使用非常方便。但是需要注意一下的是,plot2svg 已經三四年沒有更新過了,對于2014以后版本的 MATLAB 會報錯,只需要進入 plot2svg.m 文件中將所有的 str2num 改為 str2double 即可。仍然是剛才那個圖形,將其導出為 svg 格式:
plot2svg('E:Graphic3.svg');
svg 文件當然是極好的,又能透明又是矢量,比如下面這張,不管你怎么縮放現在這個頁面都能保證一直是清晰的
但是我們的目標是%20eps。我先試了一下免費的 Inkscape,還是用%20300dpi%20導出,不選擇柵格化:
可惜導出之后還是變成了位圖(不過貌似使用 Inkscape 導出時會自動抗鋸齒?對比下圖和上面 export_fig 的結果就會發現):


沒辦法只能用 AI 了。我為了把這個問題解決特意去下載了一個 AI,感覺有些大材小用啊... 還好,問題解決了!AI 導出時全部使用默認設置,除了把 dpi 調到300:

導出,真•矢量圖達成!


繼續放大:

最后總結一下工作流:
1、使用 plot2svg 函數先將 MATLAB 中生成的圖形以 .svg 格式導出;
2、在 Adobe Illustrator 中打開 svg 文件,再將其以 .eps 格式導出。
附帶說一下,本文轉載自:https://capbone.com/use-matlab-to-export-vector-graphics-with-transparent-features/。這個方法只有必要對 MATLAB 中的帶透明屬性的 patch、edge 對象進行操作,如果僅僅是令當前窗口或當前坐標軸的背景透明,用自帶的 print 和 export_fig 都能實現,沒必要搞得那么復雜。
新聞熱點
疑難解答