Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C++ (http://www.velocityreviews.com/forums/f39-c.html)
-   -   Bitmap image scaling and Printer resolution (http://www.velocityreviews.com/forums/t459577-bitmap-image-scaling-and-printer-resolution.html)

jalpa11@hotmail.com 01-02-2007 12:38 PM

Bitmap image scaling and Printer resolution
 
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.


mlimber 01-02-2007 02:33 PM

Re: Bitmap image scaling and Printer resolution
 

jalpa11@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



All times are GMT. The time now is 10:15 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.