←Select platform

UpdateMetaFileResolution Method

Summary

Changes the resolution of an existing Windows Enhanced Metafile (EMF).

Syntax
C#
VB
C++
public static IntPtr UpdateMetaFileResolution( 
   IntPtr emfHandle, 
   int xResolution, 
   int yResolution 
) 
Public Shared Function UpdateMetaFileResolution( _ 
   ByVal emfHandle As IntPtr, _ 
   ByVal xResolution As Integer, _ 
   ByVal yResolution As Integer _ 
) As IntPtr 
public: 
static IntPtr UpdateMetaFileResolution(  
   IntPtr emfHandle, 
   int xResolution, 
   int yResolution 
)  

Parameters

emfHandle
Handle to the source EMF

xResolution
New horizontal resolution

yResolution
New vertical resolution

Return Value

A handle to the modified Windows Enhanced Metafile (EMF).

Remarks

This method is especially helpful in case you use the CreateEnhMetaFile Windows API when generating the EMF handle. For example, requirement is to create an EMF with 8.5 by 11 inches at 300 DPI. With CreateEnhMetaFile, the resolution of the generated EMF is the same as the resolution of the reference HDC. Since it is impractical to find an HDC with resolution equal to the desired one, you can use UpdateMetaFileResolution to accomplish this. Here is an example:

const int resolution = 300; 
// Calculate the width in pixels: 
int widthInPixels = (int)(8.5 * resolution); 
int heightInPixels = (int)(11.0 * resolution); 
Win32.RECT rc = new Win32.RECT(); 
rc.left = 0; 
rc.top = 0; 
rc.right = widthInPixels; 
rc.bottom = heightInPixels; 
IntPtr hdc = Win32.CreateEnhMetaFile(IntPtr.Zero, IntPtr.Zero, rc, IntPtr.Zero); 
IntPtr hEmfTemp = Win32.CloseEnhMetaFile(hdc); 
// hEmfTemp has the same resolution as the screen, change it to the desired one 
IntPtr hEmf; 
hEmf = DocumentWriter.UpdateMetaFileResolution(hEmfTemp, resolution, resolution); 
Win32.DeleteEnhMetaFile(hEmfTemp); 
// hEmf now is 8.5 by 11 at 300 

If xResolution or yResolution is 0, then the original resolution of the EMF handle will be used. If either xResolution or yResolution is equal to -1, then the aspect ratio for original EMF handle will be maintained and the positive value for either xResolution or yResolution will be used as the resolution (DPI) value for the modified emf handle.

Note that xResolution and yResolution cannot be both less than zero.

Example

This example will load an Enhanced Metafile from disk and then change its resolution to 200 by 200 dots per inch.

C#
VB
using Leadtools; 
using Leadtools.Codecs; 
using Leadtools.Document.Writer; 
using Leadtools.Ocr; 
 
private static void ShowMetaFileDimension(IntPtr hemf) 
{ 
   // Use System.Drawing.Imaging.Metafile to load the EMF and get its information 
   using (var metafile = new System.Drawing.Imaging.Metafile(hemf, false)) 
   { 
      Console.WriteLine("Size: {0} by {1} pixels", metafile.Width, metafile.Height); 
      Console.WriteLine("Resolution: {0} by {1} pixels/inch", metafile.HorizontalResolution, metafile.VerticalResolution); 
   } 
} 
 
//// Windows API 
[DllImport("gdi32")] 
private extern static IntPtr GetEnhMetaFile(string lpszMetaFile); 
[DllImport("gdi32")] 
private extern static int DeleteEnhMetaFile(IntPtr hemf); 
 
public void ChangeMetaFileResolutionExample() 
{ 
   // Load the original meta file 
   var hemf = GetEnhMetaFile(Path.Combine(LEAD_VARS.ImagesDir, "Ocr1.emf")); 
 
   // Show the dimension 
   Console.WriteLine("Original EMF dimension:"); 
   ShowMetaFileDimension(hemf); 
 
   // Change the resolution to be 200 by 200 dots/inch 
   var hemfDest = DocumentWriter.UpdateMetaFileResolution(hemf, 200, 200); 
 
   // No need for the original handle anymore 
   DeleteEnhMetaFile(hemf); 
 
   Console.WriteLine("New EMF dimension:"); 
   ShowMetaFileDimension(hemfDest); 
 
   DeleteEnhMetaFile(hemfDest); 
} 
 
static class LEAD_VARS 
{ 
   public const string ImagesDir = @"C:\Users\Public\Documents\LEADTOOLS Images"; 
} 
Imports Leadtools 
Imports Leadtools.Codecs 
Imports Leadtools.Document.Writer 
Imports Leadtools.Ocr 
 
Private Shared Sub ShowMetaFileDimension(hemf As IntPtr) 
   ' Use System.Drawing.Imaging.Metafile to load the EMF and get its information 
   Using metafile As New System.Drawing.Imaging.Metafile(hemf, False) 
      Console.WriteLine("Size: {0} by {1} pixels", metafile.Width, metafile.Height) 
      Console.WriteLine("Resolution: {0} by {1} pixels/inch", metafile.HorizontalResolution, metafile.VerticalResolution) 
   End Using 
End Sub 
 
'''/ Windows API 
<DllImport("gdi32")> 
Private Shared Function GetEnhMetaFile(lpszMetaFile As String) As IntPtr 
End Function 
<DllImport("gdi32")> 
Private Shared Function DeleteEnhMetaFile(hemf As IntPtr) As Integer 
End Function 
 
Public Sub ChangeMetaFileResolutionExample() 
   ' Load the original meta file 
   Dim hemf As IntPtr = GetEnhMetaFile(Path.Combine(LEAD_VARS.ImagesDir, "Ocr1.emf")) 
 
   ' Show the dimension 
   Console.WriteLine("Original EMF dimension:") 
   ShowMetaFileDimension(hemf) 
 
   ' Change the resolution to be 200 by 200 dots/inch 
   Dim hemfDest As IntPtr = DocumentWriter.UpdateMetaFileResolution(hemf, 200, 200) 
 
   ' No need for the original handle anymore 
   DeleteEnhMetaFile(hemf) 
 
   Console.WriteLine("New EMF dimension:") 
   ShowMetaFileDimension(hemfDest) 
 
   DeleteEnhMetaFile(hemfDest) 
End Sub 
 
Public NotInheritable Class LEAD_VARS 
   Public Const ImagesDir As String = "C:\Users\Public\Documents\LEADTOOLS Images" 
End Class 

Requirements

Target Platforms

Help Version 20.0.2020.3.31
Products | Support | Contact Us | Intellectual Property Notices
© 1991-2020 LEAD Technologies, Inc. All Rights Reserved.

Leadtools.Document.Writer Assembly