2009-11-23 11 views
7

アンチエイリアスが有効になっているEMFメタファイル(描画ツールからエクスポートされたフォーム)を描画する方法はありますか?私が試したツールは、エイリアスファイルをエイリアス化してエクスポートすることができないので、私のコントロールのOnPaintオーバーライドでemfを描くときに手動で元の状態に戻すことができるかどうか疑問に思った。EMFアンチエイリアスを描画する

技術的にアンチエイリアス処理されたemfファイルを生成することができると誰かが確認できる場合は、アンチエイリアス処理されたemfにエクスポートできる描画ツールを使用するか、サードパーティ製のコンバータで後で行います。そのようなツールを誰かが知っているなら、私に知らせてください。

編集:emf instructionsを見ると、emf自体がアンチエイリアスされているかどうかに関係なく、実際に情報を格納できるようには見えません。少なくとも私は何も見つけることができませんでした。アンチエイリアシングは、再生エンジンによって行われる可能性が高くなります。たとえば、Word 2007でEMFを開くと、エイリアスがレンダリングされます。しかし、私はGDI + "再生エンジン"(Graphics.DrawImage(...))でそれを描画しません。または私はそれを標準のWindowsイメージビューアとみなします。 これは、実際には独自のemf再生エンジンを備えているツールがあると考えています。だからおそらく私にはemf命令のオブジェクトモデルを与えるemsファイルに格納されている無料の.NETライブラリ(できればソースコード)がありますので、Graphics.DrawImage(...)の代わりに自分自身でそれを再生できますか?

+2

他のすべてが失敗した場合は、サイズの4倍でそれを描画し、次にダウンサンプリングすることができます。 – Joey

+0

私は小さなサイズでこれを試しましたが、これはまだ醜いです。また、このアプローチを使用すると、おそらく醜いメモリオーバーヘッドがあります。 (私はそのようなUserControlを一度にたくさん表示します)。 – bitbonk

+0

重複:http://stackoverflow.com/questions/1422949/emf-with-forced-antialiasing – liori

答えて

9

DirectXプロジェクトでも同様の問題がありました。アップスケーリングとダウンスケーリングはある程度は機能しますが、それは偽りです。それが何かを何度も何度もやり直す必要があるなら、おそらくWMFのレコードを解析し、それらをGDI +アンチエイリアスで描くことができます。

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

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

[編集:]

これら三つのプログラムバックこのアップ(彼らは2005年からそう物事が変更されているかもしれませんね)

次のスレッドあなたのために仕事をするかもしれません:私はあなたが手でそれを行うと大丈夫だと仮定しています:

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は:]:

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

さて、ここであなたはさまざまな方法でEMFを検査できるようになるプログラムです

...ここにフリーウェアがありますEMFコマンドのうち122個を解析し、GDI +でそれらを出力するライブラリです。ああ...

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

、予告もCodeProjectのページに#3コメント:それはおそらく、トリックを行う必要があります。誰かが前に壁に頭を打つように見える。これがあなたの問題を解決することを願っています。

+0

これらのプログラムは他のファイル形式に変換するようです。これはGDI +が処理できる唯一のベクトル形式なので、ベクトルアートを表示するためにEMFを選択しました。実行時に動的に変更してアニメーション化するので、コード(したがってGDI +)からアートを描画する必要があります。また、GDI +でemfを表示することは、ベクターアートを表示するためのCPUおよびメモリに最も適した方法です。 emfが役立つように見えない別のフォーマットを使用する。クールなソリューションは、Vectorgrafik(任意の形式)をC#GDI + instrructionsコンバータに使用することです。 – bitbonk

+0

その場合、保持モード描画システムを使用し、EMFをすべて省略するのはなぜですか?理論的には、EMF画像を保存し、カスタムライブラリを使用して各図形を抽出し、GDI(+)で再描画することができます。しかし、あなたの問題の説明から、オブジェクトを使ってイメージを記述して、それを問題の表面にレンダリングする独自のフォーマットを作成していたでしょう。 別のアプローチとして、swfを使用することができます。これははるかに優れており、よく文書化されており、より多用途なIMOです。 – Pedery

+0

一般的な描画ソフトウェア(イラストレーター、inkscape、coreldraw ...のいずれか)でアートを描く必要があるため、プロフォーマリフォーマットは使用できません。 – bitbonk

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の列挙は、emfexplorerによって行われましたが、デルファイで書かれていても、some code perhaps more easy to followと書いてあります。

私はConvertToEmfPlusを使用して解決策を見つけ出し、この方法が利用できない場合に備えてチューニングされたオープンソースコードを書くのに多くの時間を費やしたので、ちょっと(今は遅かったです)

関連する問題