J
jalpa11
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.
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.