2010-03-24 198 views
1

目前我有第三方控件生成一个图元文件。我可以将.wmf文件保存到磁盘上,但无法解决问题。问题是如何将Metafile呈现为Tiff文件。VB.net将MetaFile/EMF保存为位图(.tiff)

目前我有下面的代码来获取我的图元文件并保存它。

Dim mf As Metafile = page.GetImage(TXTextControl.Page.PageContent.All) 



         Dim enhMetafileHandle As IntPtr = mf.GetHenhmetafile() 

         Dim h As IntPtr 
         Dim bufferSize As UInteger = GetEnhMetaFileBits(enhMetafileHandle, 0, h) 
         Dim buffer(CInt(bufferSize)) As Byte 

         GetEnhMetaFileBits(enhMetafileHandle, bufferSize, buffer) 

         Dim msMetafileStream As New MemoryStream 
         msMetafileStream.Write(buffer, 0, CInt(bufferSize)) 


         Dim baMetafileData() As Byte 
         baMetafileData = msMetafileStream.ToArray 
         Dim g As Graphics = Graphics.FromImage(mf) 


         mf.Dispose() 



         File.WriteAllBytes("c:\a.wmf", baMetafileData) 

端子

_ 公共共享功能GetEnhMetaFileBits(BYVAL HEMF作为System.IntPtr,BYVAL n大小作为UInteger,BYVAL的lpData作为IntPtr的)作为UInteger 结束函数

<System.Runtime.InteropServices.DllImportAttribute("gdi32.dll", EntryPoint:="GetEnhMetaFileBits")> _ 

Public Shared Function GetEnhMetaFileBits(<System.Runtime.InteropServices.InAttribute()> ByVal hEMF As System.IntPtr, ByVal nSize As UInteger, ByVal lpData() As Byte) As UInteger 
End Function 

我已经尝试过各种图像和图形调用,并且无法将元文件保存为.tiff文件。任何建议都会很棒。我甚至试图创建一个新的位图并将图元文件绘制到它上面。我总是会抛出一个GDI异常。

回答

0

我最后的代码如下所示:

Dim NewGraphic As Graphics = Nothing 
     Dim BitonalImage As Bitmap = Nothing 

     Using bmp As New Bitmap(3264, 4224) 
      Try 

       NewGraphic = Graphics.FromImage(bmp) 
       NewGraphic.FillRectangle(New SolidBrush(Color.White), 0, 0, 3264, 4224) 
       NewGraphic.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic 
       NewGraphic.SmoothingMode = Drawing2D.SmoothingMode.HighQuality 
       NewGraphic.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality 
       NewGraphic.CompositingQuality = Drawing2D.CompositingQuality.HighQuality 
       NewGraphic.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit 

       NewGraphic.DrawImage(MetaFileToConvert, 0, 0, 3264, 4224) 

       BitonalImage = CType(ConvertToBitonal(CType(bmp, Bitmap)), Bitmap) 
       BitonalImage.SetResolution(385, 385) 

       OutBMP = BitonalImage 

      Catch ex As Exception 
       Throw ex 
      Finally 
       NewGraphic.Dispose() 
       BitonalImage.Dispose() 
      End Try 

     End Using 
0

你的代码很难破译。只需将图元文件绘制为位图即可完成工作。例如:

Dim mf As Metafile = page.GetImage(TXTextControl.Page.PageContent.All) 
Using bmp As New Bitmap(mf.Width, mf.Height) 
    Using gr As Graphics = Graphics.FromImage(bmp) 
    gr.DrawImage(mf, 0, 0) 
    End Using 
    bmp.Save("c:\temp\test.tiff", ImageFormat.Tiff) 
End Using 
+0

这工作,我刚刚与DPI搞砸让我.TIFF是高质量的。 – pehaada 2010-03-28 16:41:09

+0

元文件是可扩展的。使位图尽可能大,使用带有Rectangle的DrawImage重载。 – 2010-03-28 16:54:08