2016-06-28 30 views
0

アンチエイリアスレンダリングを行うためにWMFをEMF +に変換した後、EMF +への変換後に、WMFの左上象限のみが含まれます。画像の3分の1を失うことなく、WMFからEMF +をGdipConvertToEmfPlusに変換する方法は?

EnumerateMetafileでWMF(変換前)を描画しますが、アンチエイリアスはありません。これは私がここで狙っているものです。

変換の際に画像の4分の3が失われる理由はありますか?

WMFは、AutoCAD LTによって作成され、32640x14586ピクセルのサイズで、単位/インチ= 1632で生成されました。私はmetafilecallbackにSetPageTransformとSetClipRegionをスキップし、また前にグラフィックスを縮小しようとした

EmfMin 
Header 
SetAntiAliasMode 
SetPixelOffsetMode 
SetTextRenderingHint 
MultiplyWorldTransform 
Save 
MultiplyWorldTransform 
SetWorldTransform 
BeginContainerNoParams 
SetAntiAliasMode 
SetPixelOffsetMode 
SetTextRenderingHint 
SetPageTransform 
SetWorldTransform 
SetWorldTransform 
SetWorldTransform 
SetWorldTransform 
SetWorldTransform 
Object 
Object 
DrawPath 
... 
SetClipRegion 
EndContainer 
Restore 
SetWorldTransform 
EndOfFile 
EmfEof 

が、何も助けなかっ:

(変換後)EMFのレコードタイプがあります。

検査のために元のWMFを共有できるかどうかを確認します。

は変換がこの質問を経由して、ここで行われている方法を参照してください: How to enable anti-aliasing when rendering WMF to BitMap in C#/WPF/WinForms?

答えて

0

だから、私は0.75でSetWorldTransformレコードの行列をスケーリングしなければならなかった、それはすべて大丈夫??!

これは、私のEnumerateMetafile呼び出しコードが周囲のコードとどのように見えるかを他の誰かがこのようにした場合です。

graphics.EnumerateMetafile(emfPlusMetaFile, new PointF(0, 0), 
    (recordType, flags, dataSize, data, callbackData) => 
    { 
     var dataArray = GetDataArray(data, dataSize); 
     AdjustWorldTransformScale(recordType, dataArray, 0.75f); 
     emfPlusMetaFile.PlayRecord(recordType, flags, dataSize, dataArray); 
     return true; 
    } 
); 


private static void AdjustWorldTransformScale(EmfPlusRecordType recordType, byte[] dataArray, float wtfScale) 
{ 
    if (recordType == EmfPlusRecordType.SetWorldTransform) 
    { 
     using (var stream = new MemoryStream(dataArray)) 
     using (var reader = new BinaryReader(stream)) 
     using (var writer = new BinaryWriter(stream)) 
     { 
      var m11 = reader.ReadSingle(); 
      var m12 = reader.ReadSingle(); 
      var m21 = reader.ReadSingle(); 
      var m22 = reader.ReadSingle(); 

      stream.Position = 0; 

      writer.Write(m11*wtfScale); 
      writer.Write(m12*wtfScale); 
      writer.Write(m21*wtfScale); 
      writer.Write(m22*wtfScale);     
     } 
    } 
} 

private static byte[] GetDataArray(IntPtr data, int dataSize) 
{ 
    if (data == IntPtr.Zero) return null; 

    // Copy the unmanaged record to a managed byte buffer that can be used by PlayRecord. 
    var dataArray = new byte[dataSize]; 
    Marshal.Copy(data, dataArray, 0, dataSize); 
    return dataArray; 
} 

(スケーリングパラメータのネーミングは意図的なものである。)

+0

なぜdownvote? – Macke

関連する問題