Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > Bitmap image scaling and Printer resolution

Reply
Thread Tools

Bitmap image scaling and Printer resolution

 
 
jalpa11@hotmail.com
Guest
Posts: n/a
 
      01-02-2007
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.

 
Reply With Quote
 
 
 
 
mlimber
Guest
Posts: n/a
 
      01-02-2007

http://www.velocityreviews.com/forums/(E-Mail Removed) 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

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Cropping and Scaling an image JJ ASP .Net 3 11-19-2007 01:23 PM
Help! How can I draw a bitmap only with BITMAP information! xqggz C++ 1 06-19-2007 03:07 PM
Scaling PNG image ko021_626@hotmail.com Java 3 04-30-2004 01:37 PM
Masked bitmap from bitmap Gandalf Python 0 01-29-2004 09:41 PM
Overriding browser image auto-scaling Daniel L. Bateman HTML 6 10-30-2003 09:59 PM



Advertisments