「電波とどいた?」
2008/10版 その3

2008/10/29 (水)

EMF画像の扱い (吉里吉里)

_ 吉里吉里で 簡単にベクタ画像を扱えるようにしてみた わけなのですが……問題が一つ。ベクタ画像形式としては、Microsoft Office 用の クリップアートでおなじみの WMF と EMF が使えるのですが、古い WMF はさておき、 EMFは、版によってアンチエイリアスがかかったりかからなかったりします。 では、そのアンチエイリアスがかかるようなデータはどうやってつくればいいのでしょう?

_ 今までに判明してたこと

  • アンチエイリアスがかかるのは EMF+ という GDI+ 専用データが格納された形式に限る
  • EMF+ には GDI+レコードだけの EMF+ ONLY と、GDIレコードも多重化して互換性維持した EMF+ DUAL がある
  • GDI+ のライブラリを使えば EMF+ データを自前で作ることはできる(アンチエイリアスもかかる)
  • Adobe Illustrator から EMF で export したものは EMF+ ではない
  • PowerPoint から EMF で export したものは EMF+ らしく、アンチエイリアスがかかる
  • PowerPoint で背景を透明にしておけば色を抜くことはできるので一応使える

_ どうやら、世界的に EMF を、EMF+ に変換したいというニーズは 一部にあるようなのですが(たぶん同様にGDI+で使いたいのでしょう)、 それに対する明確な回答が提供されていないようなのです。

_ WMF/EMF は GDI ベース、EMF+ は GDI+ ベースで、単純な置換処理はできません。 意味的に解釈して、代替処理をおこす必要があります。そこまで完成された ライブラリは残念ながら MS から提供されていません。PowerPoint に WMF/EMF を はりつけて出力すると、アンチエイリアスがかかった状態のものになるので、 内部的には相当処理があるはずではあるんですが……。 PowerPoint は画像素材用に使うにはさすがに牛刀すぎます。 EMF から、あるいは PDF とか SVG とかから変換できるツールで EMF+ をはく ようなものがないか、とかいろいろ探してみましたが、ことごとくただのEMFでした。

_ EMFExplorerという、 オープンソースなツールがあって、これは、EMF を自前で解釈して GDI+ を 使ってアンチエイリアス表示するのですが、あくまで表示用ライブラリと してだけつかってるようで、残念ながらアンチエイリアスのかかった EMF+ を 出力することはできませんでした。表示処理部分をがんばって改造して そこに口を作ればよさそうではあるのですがそこまでやる元気は……

_ と、そこで、XAML のことを思いだしました。そういえば MS の新世代はこっちだよな ってことで探してみると、XamlToys なるものを発見。.NET Framework を使って XAML から EMFを生成してるようです。 さて、.NET Framework のもつ旧描画系の実装の実体はなんだったでしょう? はい、正解、GDI+ です、ということは、これの出力が EMF+ になってる可能性が高いです。

_ ということで試してみることに。Expression Design という MSの開発向け グラフィックデザイン用のツールがありまして、これは当然作成した 画像ファイルを XAML 形式で出力できます。そして、このツール、後発だけあって、 ライバルたる Adobe Illustrator の AI ファイルが読み込みできるのでした。 ActionPack でゲットしたライセンスが役に立つ日が。

_ Illustrator でグラフィック素材を準備→aiで出力→ Expression Design で読み込み→XAMLで出力 →XamlToys で EMFに変換 → アンチエイリアスされるEMFファイルの作成に成功! まだ TODO な部分もいろいろあるようなのですが、とりあえずロゴとかなら問題なさそうです。 やー、これでまともに画像素材として使える道ができた。機能あってもツールないとお話にならんですからね……。 というかですね、そもそも、なぜ Expression Design には、直接 EMF 出力が無いんでしょうか。 例によってチーム違いの壁なんでしょうけど、MS Office は Out of 眼中のようです(苦笑)。 XAMLはOfficeへの直接貼り付けが出来ないから EMF 対応は必要だと思うんですが。

_ 立ち絵が全部ベクター画像、とかかなり楽しそうではあるけど、 さすがに作業量的に難しいと思うので、とりあえずは UI系の 高精細化につかえないかなーとか思案中。ただ、現行の吉里吉里 では、複数解像度の混在ができないので、primaryLayer単位で 解像度変更ができるような drawDevice を作らないとダメですね。 内部的にはUI系処理は解像度フリーにしておいて、Direct3D が 使えて、巨大なサーフェースが別途確保できれば、それを使ってフル解像度で、 できなければ、旧来の吉里吉里のレイヤ合成ロジック内で、 基本サイズと同じ解像度で表示、とかそんなかんじで。




メールはこちらへ...[わたなべごう (go @(at) denpa .(dot) org)]

この日記は、GNSを使用して作成されています。