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缩略的函数....呵呵