用atl写的缩略图组件

STDMETHODIMP Cgetimage::LoadPicture(VARIANT vFilename)
{
 // TODO: Add your implementation code here
    CComVariant v_1( vFilename );
 v_1.ChangeType( VT_BSTR );
 CComBSTR bstr( v_1.bstrVal );

 hBmp=(HBITMAP)LoadImage(NULL, (LPCTSTR)bstr, IMAGE_BITMAP, 0, 0,
               LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE );

 return S_OK;
}
没啥好说的,先load进一个bmp

STDMETHODIMP Cgetimage::SavePicture(VARIANT vFilename)
{
 CComVariant v_1( vFilename );
 v_1.ChangeType( VT_BSTR );
 CComBSTR bstr( v_1.bstrVal );

 BITMAP bmp;
 BITMAP bmp1;
    PBITMAPINFO pbmi;
 long lwidth;
 long lheight;
 float iRate = 0.5;
 HDC hdcSrc;
    HDC hdcDest;
 HDC hDC;
    WORD    cClrBits;
 HANDLE hf;                 // file handle
    BITMAPFILEHEADER hdr;       // bitmap file-header
    PBITMAPINFOHEADER pbih;     // bitmap info-header
    LPBYTE lpBits;   
 DWORD dwTotal;              // total count of bytes
    DWORD cb;                   // incremental count of bytes
    BYTE *hp;                   // byte pointer
    DWORD dwTmp;
  
 GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp);
 lwidth=bmp.bmWidth;
 lheight=bmp.bmHeight;
 
 hdcSrc = CreateCompatibleDC(NULL);
 hdcDest = CreateCompatibleDC(NULL);

 SelectObject(hdcSrc,hBmp);
 
 HBITMAP hmD= CreateCompatibleBitmap(hdcSrc, (int)(lwidth * iRate), (int)(lheight * iRate));
 SelectObject(hdcDest, hmD);
 long lOrigMode = SetStretchBltMode(hdcDest, STRETCH_HALFTONE);
 StretchBlt(hdcDest, 0, 0, lwidth * iRate,
  lheight * iRate, hdcSrc, 0, 0, lwidth, lheight, SRCCOPY);
 SetStretchBltMode(hdcDest, lOrigMode);

    GetObject(hmD, sizeof(BITMAP), (LPSTR)&bmp1);

 cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);

 hDC=GetDC(NULL);

    if (cClrBits == 1)
        cClrBits = 1;
    else if (cClrBits <= 4)
        cClrBits = 4;
    else if (cClrBits <= 8)
        cClrBits = 8;
    else if (cClrBits <= 16)
        cClrBits = 16;
    else if (cClrBits <= 24)
        cClrBits = 24;
    else cClrBits = 32;

  if (cClrBits != 24)
         pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
                    sizeof(BITMAPINFOHEADER) +
                    sizeof(RGBQUAD) * (1<< cClrBits));
     else
         pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
                    sizeof(BITMAPINFOHEADER));

 pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    pbmi->bmiHeader.biWidth = bmp1.bmWidth;
    pbmi->bmiHeader.biHeight = bmp1.bmHeight;
    pbmi->bmiHeader.biPlanes = bmp1.bmPlanes;
    pbmi->bmiHeader.biBitCount = bmp1.bmBitsPixel;
    if (cClrBits < 24)
        pbmi->bmiHeader.biClrUsed = (1<<cClrBits);

  
    pbmi->bmiHeader.biCompression = BI_RGB;

    pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8
                                  * pbmi->bmiHeader.biHeight;

 pbmi->bmiHeader.biClrImportant = 0;

 pbih = (PBITMAPINFOHEADER) pbmi;
    lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);
 GetDIBits(hDC,hmD, 0, (WORD) pbih->biHeight, lpBits, pbmi,
        DIB_RGB_COLORS);

  hf = CreateFile((LPCTSTR)bstr,
                   GENERIC_READ | GENERIC_WRITE,
                   (DWORD) 0,
                    NULL,
                   CREATE_ALWAYS,
                   FILE_ATTRIBUTE_NORMAL,
                   (HANDLE) NULL);
 hdr.bfType = 0x4d42;        // 0x42 = "B" 0x4d = "M"

  hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
                 pbih->biSize + pbih->biClrUsed
                 * sizeof(RGBQUAD) + pbih->biSizeImage);
    hdr.bfReserved1 = 0;
    hdr.bfReserved2 = 0;
 hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
                    pbih->biSize + pbih->biClrUsed
                    * sizeof (RGBQUAD);
 WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
        (LPDWORD) &dwTmp,  NULL);

 WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
                  + pbih->biClrUsed * sizeof (RGBQUAD),
                  (LPDWORD) &dwTmp, NULL);
 dwTotal = cb = pbih->biSizeImage;
    hp = lpBits;

 WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL);
 CloseHandle(hf);
 GlobalFree((HGLOBAL)lpBits);

 return S_OK;
}

save的时候分三段儿,其中有两段头加一段图片流,缩略也在里面了,倍数被偶规定了... 

StretchBlt缩略的函数....呵呵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值