VB.net ahorro de un metarchivo / EMF como un mapa de bits (.tiff)
Pregunta
Actualmente tengo un control de terceros que genera un metarchivo. Puedo guardar el archivo .wmf en el disco con el tema fuera. El problema es cómo se renderiza el metarchivo como un archivo TIFF.
Actualmente tengo el siguiente código para obtener mi metarchivo y guardarlo.
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)
final sub
_ Public Shared GetEnhMetaFileBits función (ByVal hEMF Como System.IntPtr, ByVal nTamaño Como UInteger, ByVal lpData como IntPtr) Como UInteger End Function
<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
He intentado todo tipo de Imagen y llamadas gráficas y simplemente no puede guardar el archivo meta como .tiff. Cualquier sugerencia seria genial. Incluso he intentado crear un nuevo mapa de bits y dibujar el metarchivo en la misma. Siempre termino con una excepción GDI siendo lanzada.
Solución 2
Mis final parece un código como:
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
Otros consejos
Su código es difícil de descifrar. Basta con dibujar el metarchivo a un mapa de bits debe hacer el trabajo. Por ejemplo:
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