//用于控制缩放显示的变量
BYTE *DisplayData; //用来缩放显示的内存显示单元
long DisplayWidth,DisplayHeight; //图像显示的宽度和高度
LPBITMAPINFO lpbmi;
};
上述声明中的Zoom(double scale)函数为图像平滑缩放函数,scale为伸缩比例,执行成功返回true,失败返回false,具体定义如下:
bool CMyBitmap::Zoom(double scale) //scale 为缩放比例
{
if (scale<=0) {return false;} //scale必须大于0
if ((scale * m_Width) <=10||(scale * m_Height) <=10) {return false; } //显示图像的宽度或高度必须大于10
DisplayWidth= long (scale * m_Width); //计算缩放后的图像宽度
DisplayHeight=long (scale * m_Height); //计算缩放后的图像高度
if (DisplayData!=NULL) delete DisplayData;
long RowsWidth=WIDTHBYTES(DisplayWidth * m_wBitCount); //每行像素的字节数
DisplayData=new BYTE[RowsWidth * DisplayHeight]; //分配用来缩放显示的数据区
if (DisplayData==NULL) return false; //分配空间失败
if (lpbmi!=NULL) delete lpbmi; //释放原来分配的空间
LPBYTE lpSourceBits,lpTargetBits;
HDC hDC=NULL,hSourceDC,hTargetDC;
HBITMAP hSourceBitmap,hTargetBitmap,hOldSourceBitmap,hOldTargetBitmap;
DWORD dwTargetBitsSize,dwTargetHeaderSize;
LPBITMAPINFO lpSrcDIB=bInfo; //像素数据区
dwTargetHeaderSize=sizeof(BITMAPINFOHEADER) + PaletteSize((LPSTR)lpSrcDIB); //计算目标头信息的大小
lpbmi=(LPBITMAPINFO)malloc(dwTargetHeaderSize); //分配空间
memcpy(lpbmi,lpSrcDIB,dwTargetHeaderSize); //拷贝位文件头信息
lpbmi->bmiHeader.biWidth=DisplayWidth; //修改图像显示宽度
lpbmi->bmiHeader.biHeight=DisplayHeight; //修改图像显示高度
hDC=GetDC(NULL); //获取当前显示上下文设备句柄
hTargetBitmap=CreateDIBSection(hDC,lpbmi,DIB_RGB_COLORS,(void **)&lpTargetBits,NULL,0);
hSourceBitmap=CreateDIBSection(hDC,lpSrcDIB,DIB_RGB_COLORS,(void **)&lpSourceBits,NULL,0);
hSourceDC=CreateCompatibleDC(hDC); //创建与当前上下文设备兼容的句柄
hTargetDC=CreateCompatibleDC(hDC);
dwTargetBitsSize= DisplayHeight * RowsWidth ; //显示数据区的大小
memcpy(lpSourceBits,m_PixelBuffer,m_datasize); //拷贝数据
lpbmi->bmiHeader.biSizeImage = dwTargetBitsSize; //目标像素区的大小
hOldSourceBitmap=(HBITMAP)SelectObject(hSourceDC,hSourceBitmap);//将源位图资源数据选入上下文设备hSourceDC
|