19,468
社区成员
发帖
与我相关
我的任务
分享
HDC hDc, hMemDC;
hDc = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
hMemDC = CreateCompatibleDC(hDc);
HBITMAP hOldBmp, hBitmap;
hBitmap = CreateCompatibleBitmap(hDc, 62,20);
hOldBmp = (HBITMAP)SelectObject(hMemDC, hBitmap);
BitBlt(hMemDC, 0, 0, 62, 20, hDc, 1703, 333, SRCCOPY);
HDC thdc = GetDC(hwnd);
BitBlt(thdc, 0, 0, 62, 20, hMemDC, 0, 0, SRCCOPY);
BitBlt(hMemDC, 0, 0, 62, 20, thdc, 62, 0, SRCCOPY);
{
BITMAPINFO bitmapInfo = { 0 };
bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
GetDIBits(hMemDC, hBitmap, 0, 20, NULL, &bitmapInfo, DIB_RGB_COLORS);
unsigned char* bitmapBits = new unsigned char[bitmapInfo.bmiHeader.biSizeImage];
memset(bitmapBits, 0, bitmapInfo.bmiHeader.biSizeImage);//初始为0
//第二次才会有数据
GetDIBits(hMemDC, hBitmap, 0, 20, bitmapBits, &bitmapInfo, DIB_RGB_COLORS);
unsigned int rgb = GetPixel(hMemDC, 0, 0);
delete[]bitmapBits;
}
BitBlt(hMemDC, 0, 0, 62, 20, thdc, 0, 0, SRCCOPY);
ReleaseDC(hwnd, thdc);
//第一次调用 GetDIBits函数,并将参数五置为NULL,且bitmapInfo的BITMAPINFOHEADER结构的biSize已经初始化过,
//函数将会把图像的宽,高还有整个图像所点的字节数填充到bitmapInfo结构中,以便接下来的使用
BITMAPINFO bitmapInfo = { 0 };
bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
GetDIBits(hMemDC, hBitmap, 0, 20, NULL, &bitmapInfo, DIB_RGB_COLORS);
unsigned char* bitmapBits = new unsigned char[bitmapInfo.bmiHeader.biSizeImage];
memset(bitmapBits, 0, bitmapInfo.bmiHeader.biSizeImage);//初始为0
//第二次才会有数据
GetDIBits(hMemDC, hBitmap, 0, 20, bitmapBits, &bitmapInfo, DIB_RGB_COLORS);
unsigned int rgb=GetPixel(hMemDC, 0, 0);
void CVC60Doc::Save8BitBmp(HBITMAP hSrcBmp,char *fileName)
{// hSrcBmp is an 8 bits bmp.
char defFileName[MAX_PATH];
strcpy(defFileName,m_fileName);
char *slashAt=strrchr(defFileName,'\\');
if(slashAt) *slashAt=0;
if(hSrcBmp==m_hBmpRight)
{
strcat(defFileName,"\\Octree8.bmp");
}
else
{
strcat(defFileName,"\\Popularty8.bmp");
}
// bmp info
BITMAP bmp;
GetObject(hSrcBmp, sizeof(BITMAP), &bmp);
bmp.bmWidthBytes = (bmp.bmWidthBytes + 3) & ~3;
DWORD dwBitsSize = bmp.bmHeight * bmp.bmWidthBytes;//
//
DWORD dwHeaderSize = sizeof(BITMAPINFO) + (256 * sizeof(RGBQUAD));
LPBITMAPINFO lpbmi = NULL;
lpbmi = (LPBITMAPINFO)malloc(dwBitsSize);
lpbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbmi->bmiHeader.biWidth = bmp.bmWidth;
lpbmi->bmiHeader.biHeight = bmp.bmHeight;
lpbmi->bmiHeader.biPlanes = 1;
lpbmi->bmiHeader.biBitCount = 8;
lpbmi->bmiHeader.biCompression = BI_RGB;
lpbmi->bmiHeader.biSizeImage = 0;
lpbmi->bmiHeader.biXPelsPerMeter = 0;
lpbmi->bmiHeader.biYPelsPerMeter = 0;
lpbmi->bmiHeader.biClrUsed = 256;
lpbmi->bmiHeader.biClrImportant = 256;
lpbmi->bmiHeader.biSizeImage = dwBitsSize;
//
HDC hDC = GetDC(NULL);
HDC hSourceDC = CreateCompatibleDC(hDC);
// we Select the src Object, for the info
HBITMAP hOldSourceBitmap = (HBITMAP)SelectObject(hSourceDC,hSrcBmp);
// Get colors
GetDIBColorTable(hSourceDC, 0, 256, lpbmi->bmiColors);
// Get bits
BYTE *Bits=new BYTE[dwBitsSize];
GetDIBits(hSourceDC,hSrcBmp,0,lpbmi->bmiHeader.biHeight,Bits,lpbmi,DIB_RGB_COLORS);//
// setback
SelectObject(hSourceDC, hOldSourceBitmap);
// we have all we need; do saving
FILE *p1;
if(fileName)
{
strcpy(defFileName,fileName);
}
p1 = fopen(defFileName,"wb");
// file head
BITMAPFILEHEADER headBMP;
headBMP.bfType='MB';
headBMP.bfSize=dwBitsSize;
headBMP.bfOffBits= sizeof(BITMAPFILEHEADER) +// 14
sizeof(BITMAPINFOHEADER) +// 40
sizeof(RGBQUAD)*256;
headBMP.bfReserved1=0;
headBMP.bfReserved2=0;
// file write
fwrite(&headBMP, 1, sizeof(BITMAPFILEHEADER), p1);//14
fwrite(lpbmi, 1, sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256,p1);//40 + 4*256 colors
fwrite(Bits, 1, dwBitsSize, p1);// Dibs
fclose(p1);
// free
delete []Bits;
DeleteDC(hSourceDC);
ReleaseDC(NULL, hDC);
free(lpbmi);
//
AfxMessageBox(CString("8 Bits BitMap '") + defFileName +"' Saved!");
}