关于图象缩放 我在写一个图象缩放的函数,写来写去总是有问题,哪位高手能帮个忙,按以下的形式给出代码,不胜感激!HANDLE Zoom(HANDLE hdib,float num)hdib是原图象的句柄,num是缩放系数,返回值是缩放后图象的句柄 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你把数据读入后,就可以这样显示了。void CImageView::OnDraw(CDC* pDC){ CImageDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here if( m_nDrawBmpFlag > 0) { CRect rect; GetClientRect (&rect); int nWidth = rect.Width (); int nHeight = rect.Height (); //////////////////////////// HDC hMemDC; HBITMAP hClientBitmap,hOldBitmap; BITMAPINFOHEADER BmpInforHead; LPBYTE pBits = NULL; ZeroMemory(&BmpInforHead, sizeof(BITMAPINFOHEADER)); BmpInforHead.biSize = sizeof(BITMAPINFOHEADER); BmpInforHead.biWidth = nWidth; BmpInforHead.biHeight = nHeight; BmpInforHead.biPlanes = 1; BmpInforHead.biBitCount = 24; BmpInforHead.biCompression = BI_RGB; BmpInforHead.biSizeImage = 0; BmpInforHead.biXPelsPerMeter = 0; BmpInforHead.biYPelsPerMeter = 0; BmpInforHead.biClrUsed = 0; BmpInforHead.biClrImportant = 0; //生成适合于当前客户区Client大小的m_hClientBitmap hClientBitmap = ::CreateDIBitmap( pDC->GetSafeHdc(), &BmpInforHead, DIB_RGB_COLORS, ( void** )( & pBits ), NULL, 0); hMemDC = ::CreateCompatibleDC( pDC->GetSafeHdc() ); hOldBitmap = ( HBITMAP ) ::SelectObject ( hMemDC , hClientBitmap ); HBRUSH hbrOld = ( HBRUSH ) ::SelectObject ( hMemDC , CreateSolidBrush(RGB(255,255,255))); ::PatBlt( hMemDC, 0, 0, nWidth, nHeight, PATCOPY ); m_pointScrollPosition = GetScrollPosition(); DrawImage(hMemDC, m_pointScrollPosition, nWidth, nHeight, m_fMultipleOfImageWidth, m_fMultipleOfImageHeight ); ::BitBlt( pDC->GetSafeHdc(),//从内存向屏幕的拷贝。 m_pointScrollPosition.x,m_pointScrollPosition.y, nWidth,nHeight, hMemDC, 0,0, SRCCOPY ); ::SelectObject( hMemDC, hOldBitmap ); ::SelectObject( hMemDC, hbrOld ); ::DeleteObject( hClientBitmap ); ::DeleteObject( hMemDC ); ::DeleteObject( hOldBitmap ); ::DeleteDC( hMemDC ); } }int CImageView::DrawImage(HDC hDC, CPoint &point, //ScrollPosition int nClientWidth, int nClientHeight, //客户区的大小 float fMultipleOfImageWidth, float fMultipleOfImageHeight){ int xDest, yDest, nDestWidth, nDestHeight; int XSrc, YSrc, nSrcWidth, nSrcHeight; int nImageWidth = m_lpBMIH->biWidth; int nImageHeight = m_lpBMIH->biHeight; int nCX = int(nImageWidth * fMultipleOfImageWidth); int nCY = int(nImageHeight * fMultipleOfImageHeight); HPALETTE hPalette = ::SelectPalette(hDC, m_hPalette, TRUE); int ret = ::SetStretchBltMode(hDC,COLORONCOLOR); if( nCX <= nClientWidth && nCY <= nClientHeight ) { xDest = int((nClientWidth - nCX)/2); yDest = int((nClientHeight - nCY)/2); nDestWidth = nCX; nDestHeight = nCY; XSrc = 0; YSrc = 0; nSrcWidth = nImageWidth; nSrcHeight = nImageHeight; ::StretchDIBits(hDC,xDest,yDest,nDestWidth,nDestHeight, XSrc,YSrc,nSrcWidth,nSrcHeight, m_lpImage, (LPBITMAPINFO) m_lpBMIH, DIB_RGB_COLORS, SRCCOPY); } if( nCX > nClientWidth && nCY <= nClientHeight ) { xDest = 0; yDest = int((nClientHeight - nCY)/2); nDestWidth = nClientWidth; nDestHeight = nCY; XSrc = int( float(point.x)/fMultipleOfImageWidth); YSrc = 0; nSrcWidth = int(float(nClientWidth)/fMultipleOfImageWidth); nSrcHeight = nImageHeight; ::StretchDIBits(hDC,xDest,yDest,nDestWidth,nDestHeight, XSrc,YSrc,nSrcWidth,nSrcHeight, m_lpImage, (LPBITMAPINFO) m_lpBMIH, DIB_RGB_COLORS, SRCCOPY); } if( nCX <= nClientWidth && nCY > nClientHeight ) { xDest = int((nClientWidth - nCX)/2); yDest = 0; nDestWidth = nCX; nDestHeight = nClientHeight; XSrc = 0; YSrc = int(float(nCY-nClientHeight-point.y)/fMultipleOfImageHeight); nSrcWidth = nImageWidth; nSrcHeight = int(float(nClientHeight)/fMultipleOfImageHeight); ::StretchDIBits(hDC,xDest,yDest,nDestWidth,nDestHeight, XSrc,YSrc,nSrcWidth,nSrcHeight, m_lpImage, (LPBITMAPINFO) m_lpBMIH, DIB_RGB_COLORS, SRCCOPY); } if( nCX > nClientWidth && nCY > nClientHeight ) { xDest = 0; yDest = 0; nDestWidth = nClientWidth; nDestHeight = nClientHeight; XSrc = int( float(point.x)/fMultipleOfImageWidth); YSrc = int(float(nCY-nClientHeight-point.y)/fMultipleOfImageHeight); nSrcWidth = int(float(nClientWidth)/fMultipleOfImageWidth); nSrcHeight = int(float(nClientHeight)/fMultipleOfImageHeight); ::StretchDIBits(hDC,xDest,yDest,nDestWidth,nDestHeight, XSrc,YSrc,nSrcWidth,nSrcHeight, m_lpImage, (LPBITMAPINFO) m_lpBMIH, DIB_RGB_COLORS, SRCCOPY); } ::SetStretchBltMode(hDC,ret); ::SelectPalette(hDC, hPalette, TRUE); return TRUE;} 这是水平方向和垂直方向缩放多少,自己看看吧HGLOBAL WINAPI ZoomDIB(LPSTR lpDIB,FLOAT fXZoomRatio, FLOAT fYZoomRatio){ LONG lWidth; LONG lHeight; LONG lNewWidth; LONG lNewHeight; LONG lNewLineBytes; LPSTR lpDIBBits; LPSTR lpStr; HDIB hDIB; LPSTR lpDst; LPSTR lpNewDIB; LPSTR lpNewDIBBits; LPBITMAPINFOHEADER lpbmi; LPBITMAPCOREHEADER lpbmc; LONG i; LONG j; LONG i0; LONG j0; LONG lLineBytes; lpDIBBits = ::FindDIBBits(lpDIB); lWidth = ::DIBWidth(lpDIB); lHeight = ::DIBHeight(lpDIB); lNewWidth = (LONG)(lWidth * fXZoomRatio + 0.5); lNewHeight = (LONG)(lHeight * fYZoomRatio + 0.5); lLineBytes = WIDTHBYTES(lWidth * 8); lNewLineBytes = WIDTHBYTES(lNewWidth * 8); hDIB = (HDIB)::GlobalAlloc(GHND,lNewLineBytes * lNewHeight + *(LPDWORD)lpDIB + ::PaletteSize(lpDIB)); if(hDIB == NULL) { return NULL; } lpNewDIB = (char*)::GlobalLock((HGLOBAL)hDIB); memcpy(lpNewDIB,lpDIB,*(LPDWORD)lpDIB + ::PaletteSize(lpDIB)); lpNewDIBBits = ::FindDIBBits(lpNewDIB); lpbmi = (LPBITMAPINFOHEADER)lpNewDIB; lpbmc = (LPBITMAPCOREHEADER)lpNewDIB; if(IS_WIN30_DIB(lpDIB)) { lpbmi->biWidth = lNewWidth; lpbmi->biHeight = lNewHeight; } else { lpbmc->bcWidth = (unsigned short)lNewWidth; lpbmc->bcHeight = (unsigned short)lNewHeight; } for(i = 0; i < lNewHeight; i ++) { for(j = 0; j < lNewWidth; j ++) { lpDst = (char*)lpNewDIBBits + lNewLineBytes * (lNewHeight - 1 - i) + j; i0 = (LONG)(i / fYZoomRatio + 0.5); j0 = (LONG)(j / fXZoomRatio + 0.5); if((j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight)) { lpStr = (char *)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0; *lpDst = *lpStr; } else { *((unsigned char*)lpDst) = 255; } } } return hDIB;} 微软不是提供了一个很好的函数吗?StretchBlt进行缩放. 地震了,吓死我了,感谢以前帮助过我的人 wav文件播放可以跳过文件头 未知长度字符串的处理 关于串口GSM Modem发短信的问题 修改获得对话框中的各个控件的位置,获取设置CEdit控件的内容? 请问一个我第一次碰到的问题! 为什么VC会出现丢文件的情况 Invalidate这个函数一般用来做什么呀? VC++ 6.0转VS 2005时出现错误[求助] CSocket类怎样设置超时?(83分,决不食言) MAKELONG()函数做什么用? 如何让软件支持:以及后面的参数。
{
CImageDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
if( m_nDrawBmpFlag > 0)
{
CRect rect;
GetClientRect (&rect);
int nWidth = rect.Width ();
int nHeight = rect.Height ();
////////////////////////////
HDC hMemDC;
HBITMAP hClientBitmap,hOldBitmap;
BITMAPINFOHEADER BmpInforHead;
LPBYTE pBits = NULL;
ZeroMemory(&BmpInforHead, sizeof(BITMAPINFOHEADER));
BmpInforHead.biSize = sizeof(BITMAPINFOHEADER);
BmpInforHead.biWidth = nWidth;
BmpInforHead.biHeight = nHeight;
BmpInforHead.biPlanes = 1;
BmpInforHead.biBitCount = 24;
BmpInforHead.biCompression = BI_RGB;
BmpInforHead.biSizeImage = 0;
BmpInforHead.biXPelsPerMeter = 0;
BmpInforHead.biYPelsPerMeter = 0;
BmpInforHead.biClrUsed = 0;
BmpInforHead.biClrImportant = 0;
//生成适合于当前客户区Client大小的m_hClientBitmap
hClientBitmap = ::CreateDIBitmap( pDC->GetSafeHdc(),
&BmpInforHead,
DIB_RGB_COLORS,
( void** )( & pBits ),
NULL,
0);
hMemDC = ::CreateCompatibleDC( pDC->GetSafeHdc() );
hOldBitmap = ( HBITMAP ) ::SelectObject ( hMemDC , hClientBitmap );
HBRUSH hbrOld = ( HBRUSH ) ::SelectObject ( hMemDC , CreateSolidBrush(RGB(255,255,255)));
::PatBlt( hMemDC, 0, 0, nWidth, nHeight, PATCOPY ); m_pointScrollPosition = GetScrollPosition();
DrawImage(hMemDC,
m_pointScrollPosition,
nWidth, nHeight,
m_fMultipleOfImageWidth,
m_fMultipleOfImageHeight
);
::BitBlt( pDC->GetSafeHdc(),//从内存向屏幕的拷贝。
m_pointScrollPosition.x,m_pointScrollPosition.y,
nWidth,nHeight,
hMemDC,
0,0,
SRCCOPY ); ::SelectObject( hMemDC, hOldBitmap );
::SelectObject( hMemDC, hbrOld );
::DeleteObject( hClientBitmap );
::DeleteObject( hMemDC );
::DeleteObject( hOldBitmap );
::DeleteDC( hMemDC );
}
}
int CImageView::DrawImage(HDC hDC,
CPoint &point, //ScrollPosition
int nClientWidth, int nClientHeight, //客户区的大小
float fMultipleOfImageWidth,
float fMultipleOfImageHeight)
{
int xDest, yDest, nDestWidth, nDestHeight;
int XSrc, YSrc, nSrcWidth, nSrcHeight;
int nImageWidth = m_lpBMIH->biWidth;
int nImageHeight = m_lpBMIH->biHeight;
int nCX = int(nImageWidth * fMultipleOfImageWidth);
int nCY = int(nImageHeight * fMultipleOfImageHeight); HPALETTE hPalette = ::SelectPalette(hDC, m_hPalette, TRUE);
int ret = ::SetStretchBltMode(hDC,COLORONCOLOR); if( nCX <= nClientWidth && nCY <= nClientHeight )
{
xDest = int((nClientWidth - nCX)/2);
yDest = int((nClientHeight - nCY)/2);
nDestWidth = nCX;
nDestHeight = nCY;
XSrc = 0;
YSrc = 0;
nSrcWidth = nImageWidth;
nSrcHeight = nImageHeight;
::StretchDIBits(hDC,xDest,yDest,nDestWidth,nDestHeight,
XSrc,YSrc,nSrcWidth,nSrcHeight,
m_lpImage,
(LPBITMAPINFO) m_lpBMIH,
DIB_RGB_COLORS, SRCCOPY);
}
if( nCX > nClientWidth && nCY <= nClientHeight )
{
xDest = 0;
yDest = int((nClientHeight - nCY)/2);
nDestWidth = nClientWidth;
nDestHeight = nCY;
XSrc = int( float(point.x)/fMultipleOfImageWidth);
YSrc = 0;
nSrcWidth = int(float(nClientWidth)/fMultipleOfImageWidth);
nSrcHeight = nImageHeight;
::StretchDIBits(hDC,xDest,yDest,nDestWidth,nDestHeight,
XSrc,YSrc,nSrcWidth,nSrcHeight,
m_lpImage,
(LPBITMAPINFO) m_lpBMIH,
DIB_RGB_COLORS, SRCCOPY);
}
if( nCX <= nClientWidth && nCY > nClientHeight )
{
xDest = int((nClientWidth - nCX)/2);
yDest = 0;
nDestWidth = nCX;
nDestHeight = nClientHeight;
XSrc = 0;
YSrc = int(float(nCY-nClientHeight-point.y)/fMultipleOfImageHeight);
nSrcWidth = nImageWidth;
nSrcHeight = int(float(nClientHeight)/fMultipleOfImageHeight);
::StretchDIBits(hDC,xDest,yDest,nDestWidth,nDestHeight,
XSrc,YSrc,nSrcWidth,nSrcHeight,
m_lpImage,
(LPBITMAPINFO) m_lpBMIH,
DIB_RGB_COLORS, SRCCOPY);
}
if( nCX > nClientWidth && nCY > nClientHeight )
{
xDest = 0;
yDest = 0;
nDestWidth = nClientWidth;
nDestHeight = nClientHeight;
XSrc = int( float(point.x)/fMultipleOfImageWidth);
YSrc = int(float(nCY-nClientHeight-point.y)/fMultipleOfImageHeight);
nSrcWidth = int(float(nClientWidth)/fMultipleOfImageWidth);
nSrcHeight = int(float(nClientHeight)/fMultipleOfImageHeight);
::StretchDIBits(hDC,xDest,yDest,nDestWidth,nDestHeight,
XSrc,YSrc,nSrcWidth,nSrcHeight,
m_lpImage,
(LPBITMAPINFO) m_lpBMIH,
DIB_RGB_COLORS, SRCCOPY);
}
::SetStretchBltMode(hDC,ret);
::SelectPalette(hDC, hPalette, TRUE);
return TRUE;
}
HGLOBAL WINAPI ZoomDIB(LPSTR lpDIB,FLOAT fXZoomRatio, FLOAT fYZoomRatio)
{
LONG lWidth;
LONG lHeight;
LONG lNewWidth;
LONG lNewHeight; LONG lNewLineBytes; LPSTR lpDIBBits; LPSTR lpStr;
HDIB hDIB; LPSTR lpDst; LPSTR lpNewDIB;
LPSTR lpNewDIBBits; LPBITMAPINFOHEADER lpbmi;
LPBITMAPCOREHEADER lpbmc; LONG i;
LONG j; LONG i0;
LONG j0; LONG lLineBytes; lpDIBBits = ::FindDIBBits(lpDIB);
lWidth = ::DIBWidth(lpDIB);
lHeight = ::DIBHeight(lpDIB); lNewWidth = (LONG)(lWidth * fXZoomRatio + 0.5);
lNewHeight = (LONG)(lHeight * fYZoomRatio + 0.5); lLineBytes = WIDTHBYTES(lWidth * 8);
lNewLineBytes = WIDTHBYTES(lNewWidth * 8);
hDIB = (HDIB)::GlobalAlloc(GHND,lNewLineBytes * lNewHeight + *(LPDWORD)lpDIB + ::PaletteSize(lpDIB)); if(hDIB == NULL)
{
return NULL;
}
lpNewDIB = (char*)::GlobalLock((HGLOBAL)hDIB); memcpy(lpNewDIB,lpDIB,*(LPDWORD)lpDIB + ::PaletteSize(lpDIB)); lpNewDIBBits = ::FindDIBBits(lpNewDIB); lpbmi = (LPBITMAPINFOHEADER)lpNewDIB;
lpbmc = (LPBITMAPCOREHEADER)lpNewDIB; if(IS_WIN30_DIB(lpDIB))
{
lpbmi->biWidth = lNewWidth;
lpbmi->biHeight = lNewHeight;
}
else
{
lpbmc->bcWidth = (unsigned short)lNewWidth;
lpbmc->bcHeight = (unsigned short)lNewHeight;
}
for(i = 0; i < lNewHeight; i ++)
{
for(j = 0; j < lNewWidth; j ++)
{
lpDst = (char*)lpNewDIBBits + lNewLineBytes * (lNewHeight - 1 - i) + j;
i0 = (LONG)(i / fYZoomRatio + 0.5);
j0 = (LONG)(j / fXZoomRatio + 0.5);
if((j0 >= 0) && (j0 < lWidth) && (i0 >= 0) && (i0 < lHeight))
{
lpStr = (char *)lpDIBBits + lLineBytes * (lHeight - 1 - i0) + j0;
*lpDst = *lpStr;
}
else
{
*((unsigned char*)lpDst) = 255;
}
}
}
return hDIB;
}