我在写一个图象缩放的函数,写来写去总是有问题,哪位高手能帮个忙,按以下的形式给出代码,不胜感激!
HANDLE Zoom(HANDLE hdib,float num)
hdib是原图象的句柄,num是缩放系数,返回值是缩放后图象的句柄

解决方案 »

  1.   

    你把数据读入后,就可以这样显示了。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;
    }
      

  2.   

    这是水平方向和垂直方向缩放多少,自己看看吧
    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;
    }
      

  3.   

    微软不是提供了一个很好的函数吗?StretchBlt进行缩放.