By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
454,428 Members | 1,472 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 454,428 IT Pros & Developers. It's quick & easy.

Bitmap image scaling and Printer resolution

P: n/a
Hi all,

I have one EMF image which I want to convert to BMP. I want to scale
the BMP and want to display it in my viewport area. If scaled BMP
doesn't fit inside the viewport area then I want to change the scale
such that image can fit inside it.

If device is screen then my image gets scaled properly and fits inside
the viewport area. But if my device is printer then my image gets
scaled properly but it doesn't fit inside the viewport area. This is so
as printer has very high resolution and thus the number of pixels of
the scaled image are very high >1000 pixels.

I pass ViewportwidhtInMM, ViewportheightInMM, Scale,
DeviceHorzPixelsPerMM, DeviceVertPixelsPerMM to my function which
generates scaled BMP from EMF.
My code is as follow:
{
HENHMETAFILE hemf;
HBITMAP bitmap;
HDC memDC;
ENHMETAHEADER emh;

emf = ::GetEnhMetaFile(strFileName);

// Get the header from the enhanced metafile.
ZeroMemory( &emh, sizeof(ENHMETAHEADER) );
emh.nSize = sizeof(ENHMETAHEADER);
if( GetEnhMetaFileHeader( hemf, sizeof( ENHMETAHEADER ), &emh ) == 0 )
{
DeleteEnhMetaFile( hemf );
return FALSE;
}

RECT rect;
float fAspectRatio;

long lWidth,lHeight;
long xFrame, yFrame;

lWidth = ((long)((float)(emh.rclFrame.right - emh.rclFrame.left) /
(100.0f))) * Scale;
lHeight = ((long)((float)(emh.rclFrame.bottom - emh.rclFrame.top) /
(100.0f))) * Scale;

lWidth = lWidth * DeviceHorzPixelsPerMM;
lHeight = lHeight * DeviceVertPixelsPerMM;

ViewPortWidth = ViewPortWidth * DeviceHorzPixelsPerMM;
ViewPortHeight = ViewPortHeight * DeviceVertPixelsPerMM;

if((ViewPortWidth < lWidth) || (ViewPortHeight < lHeight))
{
if((lWidth/lHeight) == 1)
{
xFrame = min(ViewPortWidth, ViewPortHeight);
yFrame = min(ViewPortWidth, ViewPortHeight);
}
else
{
fAspectRatio = (float)lWidth/(float)lHeight;
if(fAspectRatio 1 ) //width is more than height
{
xFrame = ViewPortWidth;
yFrame = (long)((float)ViewPortHeight / fAspectRatio);
}
else //width is less than height(or equal to height)
{
yFrame = ViewPortHeight;
xFrame = (long)((float)ViewPortWidth * fAspectRatio);
}
}
}
else
{
xFrame = lWidth;
yFrame = lHeight;
}
lWidth = xFrame;
lHeight = yFrame;
- - - - -
}
Then I create BMP with lWidht X lHeight pixels which in case of printer
comes very high.

Thanks for any help.

Jan 2 '07 #1
Share this Question
Share on Google+
1 Reply


P: n/a

ja*****@hotmail.com wrote:
Hi all,

I have one EMF image which I want to convert to BMP. I want to scale
the BMP and want to display it in my viewport area. If scaled BMP
doesn't fit inside the viewport area then I want to change the scale
such that image can fit inside it.

If device is screen then my image gets scaled properly and fits inside
the viewport area. But if my device is printer then my image gets
scaled properly but it doesn't fit inside the viewport area. This is so
as printer has very high resolution and thus the number of pixels of
the scaled image are very high >1000 pixels.

I pass ViewportwidhtInMM, ViewportheightInMM, Scale,
DeviceHorzPixelsPerMM, DeviceVertPixelsPerMM to my function which
generates scaled BMP from EMF.
My code is as follow:
{
HENHMETAFILE hemf;
HBITMAP bitmap;
HDC memDC;
ENHMETAHEADER emh;

emf = ::GetEnhMetaFile(strFileName);

// Get the header from the enhanced metafile.
ZeroMemory( &emh, sizeof(ENHMETAHEADER) );
emh.nSize = sizeof(ENHMETAHEADER);
if( GetEnhMetaFileHeader( hemf, sizeof( ENHMETAHEADER ), &emh ) == 0 )
{
DeleteEnhMetaFile( hemf );
return FALSE;
}

RECT rect;
float fAspectRatio;

long lWidth,lHeight;
long xFrame, yFrame;

lWidth = ((long)((float)(emh.rclFrame.right - emh.rclFrame.left) /
(100.0f))) * Scale;
lHeight = ((long)((float)(emh.rclFrame.bottom - emh.rclFrame.top) /
(100.0f))) * Scale;

lWidth = lWidth * DeviceHorzPixelsPerMM;
lHeight = lHeight * DeviceVertPixelsPerMM;

ViewPortWidth = ViewPortWidth * DeviceHorzPixelsPerMM;
ViewPortHeight = ViewPortHeight * DeviceVertPixelsPerMM;

if((ViewPortWidth < lWidth) || (ViewPortHeight < lHeight))
{
if((lWidth/lHeight) == 1)
{
xFrame = min(ViewPortWidth, ViewPortHeight);
yFrame = min(ViewPortWidth, ViewPortHeight);
}
else
{
fAspectRatio = (float)lWidth/(float)lHeight;
if(fAspectRatio 1 ) //width is more than height
{
xFrame = ViewPortWidth;
yFrame = (long)((float)ViewPortHeight / fAspectRatio);
}
else //width is less than height(or equal to height)
{
yFrame = ViewPortHeight;
xFrame = (long)((float)ViewPortWidth * fAspectRatio);
}
}
}
else
{
xFrame = lWidth;
yFrame = lHeight;
}
lWidth = xFrame;
lHeight = yFrame;
- - - - -
}
Then I create BMP with lWidht X lHeight pixels which in case of printer
comes very high.
This group deals with the standard C++ *language*
(http://www.parashift.com/c++-faq-lit....html#faq-5.9),
whereas your question is platform-specific and ths off-topic. Please
try a group dedicated to your platform/development environment (see
that FAQ for a partial list).

Cheers! --M

Jan 2 '07 #2

This discussion thread is closed

Replies have been disabled for this discussion.