代码之家  ›  专栏  ›  技术社区  ›  pehaada

vb.net将元文件/emf保存为位图(.tiff)

  •  2
  • pehaada  · 技术社区  · 15 年前

    目前我有一个生成元文件的第三方控件。我可以将.wmf文件保存到磁盘上,但没有问题。问题是如何将元文件呈现为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)
    

    末端接头

    _ 公共共享函数getenhmetfilebits(byval hemf as system.intptr,byval nsize as uinteger,byval lpdata as intptr)as 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异常被抛出而告终。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Hans Passant    15 年前

    你的代码很难破译。只需将元文件绘制到位图中就可以完成这项工作。例如:

    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
    
        2
  •  0
  •   pehaada    15 年前

    我的最终代码如下:

     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
    
    推荐文章
    GJ.  ·  TMetafileCanvas示例
    11 年前