2016-06-28 14 views
0

앤티 앨리어싱 된 렌더링을 얻으려면 WMF를 EMF +로 변환 한 후 EMF +로 변환 한 후 내 WMF의 왼쪽 위 사분면 만 포함됩니다.WMF에서 EMF로 변환하는 방법 - 이미지의 3/4을 잃지 않고 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