拡張メタファイルを旧メタファイルに変換する


拡張メタファイルを旧メタファイルに変換するには,VCLを使うのが最も簡単である. すなわち,TMetaFileオブジェクトを作成して拡張メタファイルを読み込み,EnhancedをFalseに設定して 保存すればよい.

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  TheMetaFile: TMetaFile;
begin
   TheMetaFile := TMetaFile.Create;
   TheMetaFile.LoadFromFile( 'sample.emf' );
   TheMetaFile.Enhanced := False;
   TheMetaFile.SaveToFile( 'sample.wmf' );
end;

Windows GDIを使って同じことをやってみる.

まず,GetEnhMetaFileで拡張メタファイルのハンドルを作成する. 次に,GetWinMetaFileBitsを使って拡張メタファイル形式のレコードを旧メタファイル形式に変換する. このAPIのプロトタイプは,

function GetWinMetaFileBits(p1: HENHMETAFILE; p2: UINT; p3: PByte; p4: Integer; p5: HDC): UINT;

である. p1は拡張メタファイルのハンドルを指定する. p2は変換されたレコードを格納するバッファのサイズであり,p3はそのバッファのアドレスである. p4にはマッピングモードを指定するが,スケール可能なメタファイルを作成するには, MM_ANISOTROPICを指定する. p5は参照DCのハンドルである.

p3がnilならばGetWinMetaFileBitsは変換後のレコードを格納するのに必要なバッファのサイズを返す. したがって,最初にp3をnilとしてGetWinMetaFileBitsを呼び出してバッファのサイズを取得し, そのサイズに応じたバッファを確保して再度GetWinMetaFileBitsを呼び出す. p4にはフォームのDCのハンドルを指定すればよいだろう.

以下にプログラム例を示す. この例ではTMemoryStreamクラスを使った. このクラスを使えば,簡単にメモリの内容をファイルに保存することができる.

procedure TForm1.Button2Click(Sender: TObject);
var
  TheMetaFile: HMETAFILE;
  TheSize: Integer;
  MS: TMemoryStream;
begin
   TheMetaFile := GetEnhMetaFile( 'sample.emf' );   // 拡張メタファイルのハンドルを取得
   TheSize := GetWinMetaFileBits( TheMetafile, 0, nil, MM_ANISOTROPIC, Canvas.Handle ); // 変換後のレコードを格納するバッファのサイズを取得
   try
     MS := TMemoryStream.Create;                      // TMemoryStreamクラスのインスタンスを作成
     MS.SetSize( TheSize );                           // メモリサイズを設定
     GetWinMetaFileBits( TheMetaFile, TheSize,        // 変換後のレコードを取得
          MS.Memory, MM_ANISOTROPIC, Canvas.Handle );
     MS.SaveToFile( 'sample.wmf' );                   // 拡張子を".wmf"としてメモリの内容を保存
   finally
     MS.Free;                                         // TMemoryStreamクラスのインスタンスを破棄
     DeleteEnhMetaFile( TheMetaFile );                // 拡張メタファイルのハンドルを解放
   end;
end;


お問い合わせはメールにて: akasaka@klc.ac.jp

戻る
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送