The UpdateMetaFileResolution Method is available as an add-on to the LEADTOOLS Document and Medical Imaging toolkits.
- emfHandle
- Handle to the source EMF
- xResolution
- New horizontal resolution
- yResolution
- New vertical resolution
Visual Basic (Declaration) | |
---|---|
Public Shared Function UpdateMetaFileResolution( _ ByVal emfHandle As IntPtr, _ ByVal xResolution As Integer, _ ByVal yResolution As Integer _ ) As IntPtr |
Visual Basic (Usage) | Copy Code |
---|---|
Dim emfHandle As IntPtr Dim xResolution As Integer Dim yResolution As Integer Dim value As IntPtr value = DocumentWriter.UpdateMetaFileResolution(emfHandle, xResolution, yResolution) |
C# | |
---|---|
public static IntPtr UpdateMetaFileResolution( IntPtr emfHandle, int xResolution, int yResolution ) |
C++/CLI | |
---|---|
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).
This example will load an Enhanced Metafile from disk and then change its resolution to 200 by 200 dots per inch.
Visual Basic | Copy Code |
---|---|
Private Shared Sub ShowMetaFileDimension(ByVal hemf As IntPtr) ' Use System.Drawing.Imaging.Metafile to load the EMF and get its information Using mf As System.Drawing.Imaging.Metafile = New System.Drawing.Imaging.Metafile(hemf, False) Console.WriteLine("Size: {0} by {1} pixels", mf.Width, mf.Height) Console.WriteLine("Resolution: {0} by {1} pixels/inch", mf.HorizontalResolution, mf.VerticalResolution) End Using End Sub '' Windows API functions needed to load/delete an EMF '<DllImport("gdi32.dll")> _ 'Private Shared Function GetEnhMetaFile(ByVal lpszMetaFile As String) As IntPtr 'End Function '<DllImport("gdi32.dll")> _ 'Private Shared Function DeleteEnhMetaFile(ByVal hemf As IntPtr) As Boolean 'End Function |
C# | Copy Code |
---|---|
private static void ShowMetaFileDimension(IntPtr hemf) { // Use System.Drawing.Imaging.Metafile to load the EMF and get its information using (System.Drawing.Imaging.Metafile mf = new System.Drawing.Imaging.Metafile(hemf, false)) { Console.WriteLine("Size: {0} by {1} pixels", mf.Width, mf.Height); Console.WriteLine("Resolution: {0} by {1} pixels/inch", mf.HorizontalResolution, mf.VerticalResolution); } } //// Windows API //[DllImport("gdi32")] //private extern static IntPtr GetEnhMetaFile(string lpszMetaFile); //[DllImport("gdi32")] //private extern static int DeleteEnhMetaFile(IntPtr hemf); private static void ChangeMetaFileResolutionExample() { // Load the original meta file IntPtr 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 IntPtr 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"; } |
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.
Target Platforms: Microsoft .NET Framework 2.0, Windows 2000, Windows XP, Windows Server 2003 family, Windows Server 2008 family, Windows Vista, Windows 7