2009-11-23 152 views
7

有沒有辦法繪製emf元文件(導出形式繪圖工具)啓用抗鋸齒?我嘗試過的工具不能導出emf文件,所以我想知道是否可以在我的控件的OnPaint覆蓋中繪製emf時手動將其打開。繪製emf抗鋸齒

如果任何人都可以確認在技術上可以生成反鋸齒emf文件,另一種解決方案是使用繪圖工具,可以導出到antialiased emf或讓第三方轉換器稍後執行此操作。如果有人知道這樣的工具,請讓我知道。

編輯:當看着emf instructions似乎emf本身可以實際存儲的信息,無論它是否呈現antialiased或不。至少我找不到任何東西。反鋸齒更有可能是由播放引擎完成的。例如,當我在Word 2007中打開emf時,它將呈現antialiased。但是,當我用GDI +「播放引擎」(Graphics.DrawImage(...))繪製它時沒有。或者當我將其視爲標準的Windows圖像查看器時。這使我相信有些工具實際上有他們自己的emf回放引擎。所以也許有免費的.NET庫(最好有源代碼)給我一個存儲在解析emf文件中的emf指令的對象模型,這樣我就可以自己播放而不是使用Graphics.DrawImage(...)

+2

如果一切都失敗了,你可能可以在四倍左右的大小繪製它,然後下采樣。 – Joey 2009-11-23 13:30:15

+0

我試過這個,在小尺寸這仍然看起來很醜也使用這種方法有一個醜陋的內存開銷。 (我會一次顯示很多這樣的UserControls)。 – bitbonk 2009-11-23 17:33:04

+0

Duplicate:http://stackoverflow.com/questions/1422949/emf-with-forced-antialiasing – liori 2009-11-23 17:36:47

回答

9

我們在DirectX項目中遇到了類似的問題。放大和縮小在一定程度上起作用,但它是僞裝的。如果這是你需要反覆做的事情,你可以解析WMF的記錄,並用GDI +反抽出來繪製它們。

以下線程支持這一行動(但他們從2005年就是這樣的事情可能會改變):

http://www.dotnet247.com/247reference/msgs/28/144605.aspx

http://www.dotnetmonster.com/Uwe/Forum.aspx/dotnet-sdk/1127/Graphics-DrawImage-metafile-no-antialiasing

[編輯:]

這三個項目可能爲你做這項工作:我假設你可以用手工做:

http://emf-to-vector-converter-command-line-ser.smartcode.com/info.html

http://www.verypdf.com/pdf-editor/index.html

http://www.ivanview.com/converter/emf-batch-converter.html

[編輯II:]

嗯,這裏是一個程序,讓你檢查以各種方式EMF:

http://download.cnet.com/windows/3055-2383_4-10558240.html?tag=pdl-redir

...這是一個免費軟件庫,它可以讓你解析122個EMF命令並將它們輸出到GDI +中。這也許應該做的伎倆:

http://www.codeproject.com/KB/GDI-plus/emfexplorer.aspx?msg=2359423

...哦,並且通知還評論#3 CodeProject上的網頁上。看起來有人以前曾經撞過牆壁。希望這能解決你的問題。

+0

這些程序似乎只是將其轉換爲其他文件格式。我們選擇EMF來顯示矢量圖,因爲這是GDI +可以處理的唯一矢量格式。我們需要從代碼(因此GDI +)中汲取藝術,因爲我們在運行時動態修改它並對其進行動畫處理。使用GDI +顯示emf最有可能是用於顯示矢量圖形的CPU和內存最友好的方式。使用emf的另一種格式似乎沒有幫助。一個很酷的解決方案是將Vectorgrafik(任何格式)轉換爲C#GDI + instrructions轉換器。 – bitbonk 2009-11-26 12:02:21

+0

在這種情況下,爲什麼不使用保留模式繪圖系統並一併省略EMF?從理論上說,您可以存儲EMF圖像並使用自定義庫來提取每個形狀,並使用GDI(+)再次繪製它們。然而,從你對這個問題的描述中,我會創建一個專有格式來描述使用對象的圖像,然後將其渲染到任何表面。 另一種方法可以是使用swf,這種方法支持得更好,記錄完善,IMO更通用。 – Pedery 2009-11-26 16:55:34

+0

我們不能使用propietary格式,因爲我們需要使用通用的繪圖軟件(illustrator,inkscape,coreldraw ...其中之一)來繪製藝術品。 – bitbonk 2009-11-26 22:13:36

4

EMF使用的是GDI命令,而不是GDI +,所以它沒有抗鋸齒的概念。我懷疑,當你要求GDI +渲染文件時,它會將它發送到GDI,並只複製產生的位圖。

在代碼中複製它與重新實現GDI是一樣的,所以它不是非常可行。並非不可能,只是一項比益處更大的工作才能證明自己的理由。如果有一個可以在Windows之外打開EMF文件的開源實用程序,則可以查看源代碼。

我的猜測是Word使用下采樣技巧。

3

EMF文件是GDI命令的列表。因此,即使在GDI +下,您在繪圖之前放置了一個SmoothingMode()調用,它也不會被反鋸齒。您必須枚舉GDI命令,然後將其轉換爲GDI +命令。

在Vista/Seven下,可以使用名爲GdipConvertToEmfPlus/ConvertToEmfPlus的GDI + 1.1函數。如果您希望程序使用XP,則應該編寫自己的枚舉,然後轉換爲GDI +命令。

GDI枚舉然後轉換爲GDI +可能已經完成emfexplorer,但我寫了some code perhaps more easy to follow,即使它是用Delphi編寫的。

我剛纔說這個答案(我遲到了),因爲我花了很多時間找到一個使用ConvertToEmfPlus的解決方案,並且編寫了一些調優的開源代碼,以防萬一這種方法不可用。