2016-06-28 19 views
0

Après avoir converti WMF en EMF + pour obtenir un rendu anti-aliasé, seul le quadrant supérieur gauche de mon WMF est inclus après la conversion en EMF +.Comment convertir WMF en EMF + avec GdipConvertToEmfPlus sans perdre les trois-quarts de l'image?

Dessiner le WMF (avant la conversion) avec EnumerateMetafile fonctionne, mais ne fonctionne pas anti-alias, ce qui est ce que je recherche ici.

Des idées pour lesquelles les trois quarts de l'image sont perdus lors de la conversion?

Le fichier WMF a été généré par AutoCAD LT avec une taille de 32640x14586 pixels, avec des unités/pouce = 1632.

Les types d'enregistrement de la FEM (après conversion) sont:

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 

J'ai essayé de sauter SetPageTransform et SetClipRegion dans le metafilecallback, et mise à l'échelle aussi les graphiques avant, mais rien ne permet.

Je vais voir si je peux partager le WMF d'origine pour l'inspection.

Voyez comment la conversion se fait ici par cette question: How to enable anti-aliasing when rendering WMF to BitMap in C#/WPF/WinForms?

Répondre

0

Alors, je devais escalader la matrice d'enregistrement SetWorldTransform de 0,75, alors il est tout ok ??!

Voici comment mon code d'appel EnumerateMetafile ressemble, avec le code environnant, si quelqu'un d'autre s'y trouve.

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; 
} 

(Naming du paramètre d'échelle est intentionnel.)

+0

Pourquoi downvote? – Macke