Click here to Skip to main content
15,897,371 members
Articles / Desktop Programming / MFC

Scan2PDF

Rate me:
Please Sign up or sign in to vote.
4.90/5 (75 votes)
22 Apr 20053 min read 434.8K   20.9K   230  
A utility for bulk scanning, converting the scanned pages to PDF and burning them on CD/DVD for archiving.
/*
*********************************************************************
 * File:	ximawmf.h
 * Purpose:	Windows Metafile Class Loader and Writer
 * Author:	Volker Horch - vhorch@gmx.de
 * created:	13-Jun-2002
*********************************************************************
 */

/*
*********************************************************************
	Notes by Author:
*********************************************************************

	Limitations:
	============

	a) Transparency:

	A Metafile is vector graphics, which has transparency by design.
	This class always converts into	a Bitmap format. Transparency is
	supported, but there is no good way to find out, which parts
	of the Metafile are transparent. There are two ways how we can
	handle this:

	- Clear the Background of the Bitmap with the background color
	  you like (i have used COLOR_WINDOW) and don't support transparency.

	  below #define XMF_SUPPORT_TRANSPARENCY 0
			#define XMF_COLOR_BACK RGB(Background color you like)

	- Clear the Background of the Bitmap with a very unusual color
	  (which one ?) and use this color as the transparent color

	  below #define XMF_SUPPORT_TRANSPARENCY 1
			#define	XMF_COLOR_TRANSPARENT_R ...
			#define	XMF_COLOR_TRANSPARENT_G	...
			#define	XMF_COLOR_TRANSPARENT_B	...

	b) Resolution

	Once we have converted the Metafile into a Bitmap and we zoom in
	or out, the image may not look very good. If we still had the
	original Metafile, zooming would produce good results always.

	c) Size

	Although the filesize of a Metafile may be very small, it might
	produce a Bitmap with a bombastic size. Assume you have a Metafile
	with an image size of 6000*4000, which contains just one Metafile
	record ((e.g. a line from (0,0) to (6000, 4000)). The filesize
	of this Metafile would be let's say 100kB. If we convert it to
	a 6000*4000 Bitmap with 24 Bits/Pixes, the Bitmap would consume
	about 68MB of memory.

	I have choosen, to limit the size of the Bitmap to max.
	screensize, to avoid memory problems.

	If you want something else,
	modify #define XMF_MAXSIZE_CX / XMF_MAXSIZE_CY below

*********************************************************************
*/

#ifndef _XIMAWMF_H
#define _XIMAWMF_H

#include "ximage.h"

#if CXIMAGE_SUPPORT_WMF && CXIMAGE_SUPPORT_WINDOWS

class CxImageWMF: public CxImage
{

#pragma pack(1)

typedef struct tagRECT16
{
	short int	left;
	short int	top;
	short int	right;
	short int	bottom;
} RECT16;

// taken from Windos 3.11 SDK Documentation (Programmer's Reference Volume 4: Resources)
typedef struct tagMETAFILEHEADER
{
	DWORD	key;		// always 0x9ac6cdd7
	WORD	reserved1;	// reserved = 0
	RECT16	bbox;		// bounding rectangle in metafile units as defined in "inch"
	WORD	inch;		// number of metafile units per inch (should be < 1440)
	DWORD	reserved2;	// reserved = 0
	WORD	checksum;	// sum of the first 10 WORDS (using XOR operator)
} METAFILEHEADER;

#pragma pack()

public:
	CxImageWMF(): CxImage(CXIMAGE_FORMAT_WMF) { }

	bool Decode(CxFile * hFile, long nForceWidth=0, long nForceHeight=0);
	bool Decode(FILE *hFile, long nForceWidth=0, long nForceHeight=0)
			{ CxIOFile file(hFile); return Decode(&file,nForceWidth,nForceHeight); }

#if CXIMAGE_SUPPORT_ENCODE
	bool Encode(CxFile * hFile);
	bool Encode(FILE *hFile) { CxIOFile file(hFile); return Encode(&file); }
#endif // CXIMAGE_SUPPORT_ENCODE

protected:
	void ShrinkMetafile(int &cx, int &cy);
	BOOL CheckMetafileHeader(METAFILEHEADER *pmetafileheader);
	HENHMETAFILE ConvertWmfFiletoEmf(CxFile *pFile, METAFILEHEADER *pmetafileheader);
	HENHMETAFILE ConvertEmfFiletoEmf(CxFile *pFile, ENHMETAHEADER *pemfh);

};

#define	METAFILEKEY	0x9ac6cdd7L

// Background color definition (if no transparency). see Notes above
#define	XMF_COLOR_BACK	GetSysColor(COLOR_WINDOW)
// alternatives
//#define	XMF_COLOR_BACK	RGB(192, 192, 192)	// lite gray
//#define	XMF_COLOR_BACK	RGB(  0,   0,   0)	// black
//#define	XMF_COLOR_BACK	RGB(255, 255, 255)	// white


// transparency support. see Notes above
#define	XMF_SUPPORT_TRANSPARENCY	0
#define	XMF_COLOR_TRANSPARENT_R		211
#define	XMF_COLOR_TRANSPARENT_G		121
#define	XMF_COLOR_TRANSPARENT_B		112
// don't change
#define	XMF_COLOR_TRANSPARENT		RGB (XMF_COLOR_TRANSPARENT_R, \
										 XMF_COLOR_TRANSPARENT_G, \
										 XMF_COLOR_TRANSPARENT_B)
// don't change
#define	XMF_RGBQUAD_TRANSPARENT		XMF_COLOR_TRANSPARENT_B, \
									XMF_COLOR_TRANSPARENT_G, \
									XMF_COLOR_TRANSPARENT_R, \
									0
// max. size. see Notes above
// alternatives
//#define	XMF_MAXSIZE_CX	(GetSystemMetrics(SM_CXSCREEN)-10)
//#define	XMF_MAXSIZE_CY	(GetSystemMetrics(SM_CYSCREEN)-50)
//#define	XMF_MAXSIZE_CX	(2*GetSystemMetrics(SM_CXSCREEN)/3)
//#define	XMF_MAXSIZE_CY	(2*GetSystemMetrics(SM_CYSCREEN)/3)
#define	XMF_MAXSIZE_CX	4000
#define	XMF_MAXSIZE_CY	4000


#endif

#endif

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
CEO Solaris Electronics LLC
United Arab Emirates United Arab Emirates
I was born in Shiraz, a very beautiful famous city in Iran. I started programming when I was 12 years old with GWBASIC. Since now, I worked with various programming languages from Basic, Foxpro, C/C++, Visual Basic, Pascal to MATLAB and now Visual C++.
I graduated from Iran University of Science & Technology in Communication Eng., and now work as a system programmer for a telecommunication industry.
I wrote several programs and drivers for Synthesizers, Power Amplifiers, GPIB, GPS devices, Radio cards, Data Acquisition cards and so many related devices.
I'm author of several books like Learning C (primary and advanced), Learning Visual Basic, API application for VB, Teach Yourself Object Oriented Programming (OOP) and etc.
I'm winner of January, May, August 2003 and April 2005 best article of month competition, my articles are:


You can see list of my articles, by clicking here


Comments and Discussions