屏幕抓4位的16色彩图 画图工具打开一个24位bmp文件后,另存为时用,16色位图保存,然后就会发现保存的文件不是黑白,而是有色彩的我要的就是失去大量颜色的图啊,也就是16色位图,谁能给个完整的代码列子 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //BITMAPINFOHEADER m_bmih; // 图像信息//BYTE *m_pR; // R数据指针,width*height//BYTE *m_pG; // G数据指针,width*height//BYTE *m_pB; // B数据指针,width*heightBOOL CImageProcessor::SaveFile4(HANDLE hFile){ BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; memset(&bmfh, 0, sizeof(bmfh)); memset(&bmih, 0, sizeof(bmih)); int nBitmapSize = abs(m_bmih.biHeight) * WIDTHBYTES(m_bmih.biWidth * 4); bmfh.bfType = 'MB'; bmfh.bfOffBits = sizeof(bmfh) + sizeof(bmih) + 16 * sizeof(RGBQUAD); bmfh.bfSize = bmfh.bfOffBits + nBitmapSize; bmih.biSize = sizeof(bmih); bmih.biWidth = m_bmih.biWidth; bmih.biHeight = m_bmih.biHeight; bmih.biPlanes = 1; bmih.biBitCount = 4; bmih.biCompression = BI_RGB; bmih.biSizeImage = nBitmapSize; BYTE *pData = new BYTE[nBitmapSize]; memset(pData, 0, nBitmapSize); BYTE *pR = m_pR; BYTE *pG = m_pG; BYTE *pB = m_pB; static BYTE mapIndex[28] = { 0, 1, 2, 3, 4, 4, 5, 4, 6, 7, 8, 8, 9, 10, 10, 9, 10, 14, 11, 8, 12, 9, 10, 14, 13, 14, 14, 15 }; for(int j = 0; j < abs(bmih.biHeight); j++) { BYTE *pTemp = pData + WIDTHBYTES(bmih.biWidth * 4) * j; for(int i = 0; i < bmih.biWidth; i++) { pTemp[0] <<= 4; int nR = (*pR++ + 0x40) / 0x80; int nG = (*pG++ + 0x40) / 0x80; int nB = (*pB++ + 0x40) / 0x80; int nV = nB * 9 + nG * 3 + nR; if(mapIndex[nV] == 10 || mapIndex[nV] == 14) { float fY = 0.299 * pR[-1] + 0.587 * pG[-1] + 0.114 * pB[-1]; if(fY > 0xa0 && fY < 0xe0) nV = 27; } pTemp[0] |= mapIndex[nV]; if(i % 2) pTemp++; } if(bmih.biWidth % 2) { pTemp[0] <<= 4; } } static RGBQUAD bmiColor[16] = { {0x00, 0x00, 0x00, 0x00}, {0x00, 0x00, 0x80, 0x00}, {0x00, 0x00, 0xff, 0x00}, {0x00, 0x80, 0x00, 0x00}, {0x00, 0x80, 0x80, 0x00}, {0x00, 0xff, 0x00, 0x00}, {0x00, 0xff, 0xff, 0x00}, {0x80, 0x00, 0x00, 0x00}, {0x80, 0x00, 0x80, 0x00}, {0x80, 0x80, 0x00, 0x00}, {0x80, 0x80, 0x80, 0x00}, {0xff, 0x00, 0x00, 0x00}, {0xff, 0x00, 0xff, 0x00}, {0xff, 0xff, 0x00, 0x00}, {0xff, 0xff, 0xff, 0x00}, {0xc0, 0xc0, 0xc0, 0x00}, }; DWORD dwByteWritten = 0; ::WriteFile(hFile, &bmfh, sizeof(bmfh), &dwByteWritten, NULL); ::WriteFile(hFile, &bmih, sizeof(bmih), &dwByteWritten, NULL); ::WriteFile(hFile, bmiColor, sizeof(bmiColor), &dwByteWritten, NULL); ::WriteFile(hFile, pData, nBitmapSize, &dwByteWritten, NULL); delete[] pData; return TRUE;} datetime结构体的头文件是什么 让MDI只打开一个视图 如何让一个多文档里面的视图显示在品目的任意位置? 使用双缓冲时,为什么在函数中定义了一个CBitmap对象,在结尾处一定要删除? 用什么函数能够遍历网页上的控件 直接输入网址访问时如何伪造来源地址(Referer)? 反进程入侵实例演示 怎么用CDaoRecordset查询access数据库某个字段的内容的位置 ahao(天·狼·星星)大侠我没收到您的信 麻烦您在发一下 谢谢。 请问各位如何实现一文档多视图? hook函数的问题 串口可以打开但无法配置串口,VSPM和VSPD XP 5都是这样
//BYTE *m_pR; // R数据指针,width*height
//BYTE *m_pG; // G数据指针,width*height
//BYTE *m_pB; // B数据指针,width*height
BOOL CImageProcessor::SaveFile4(HANDLE hFile)
{
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
memset(&bmfh, 0, sizeof(bmfh));
memset(&bmih, 0, sizeof(bmih)); int nBitmapSize = abs(m_bmih.biHeight) * WIDTHBYTES(m_bmih.biWidth * 4); bmfh.bfType = 'MB';
bmfh.bfOffBits = sizeof(bmfh) + sizeof(bmih) + 16 * sizeof(RGBQUAD);
bmfh.bfSize = bmfh.bfOffBits + nBitmapSize; bmih.biSize = sizeof(bmih);
bmih.biWidth = m_bmih.biWidth;
bmih.biHeight = m_bmih.biHeight;
bmih.biPlanes = 1;
bmih.biBitCount = 4;
bmih.biCompression = BI_RGB;
bmih.biSizeImage = nBitmapSize; BYTE *pData = new BYTE[nBitmapSize];
memset(pData, 0, nBitmapSize); BYTE *pR = m_pR;
BYTE *pG = m_pG;
BYTE *pB = m_pB; static BYTE mapIndex[28] = { 0, 1, 2, 3, 4, 4, 5, 4, 6, 7, 8, 8, 9, 10, 10, 9, 10, 14, 11, 8, 12, 9, 10, 14, 13, 14, 14, 15 }; for(int j = 0; j < abs(bmih.biHeight); j++)
{
BYTE *pTemp = pData + WIDTHBYTES(bmih.biWidth * 4) * j; for(int i = 0; i < bmih.biWidth; i++)
{
pTemp[0] <<= 4; int nR = (*pR++ + 0x40) / 0x80;
int nG = (*pG++ + 0x40) / 0x80;
int nB = (*pB++ + 0x40) / 0x80;
int nV = nB * 9 + nG * 3 + nR;
if(mapIndex[nV] == 10 || mapIndex[nV] == 14)
{
float fY = 0.299 * pR[-1] + 0.587 * pG[-1] + 0.114 * pB[-1];
if(fY > 0xa0 && fY < 0xe0) nV = 27;
} pTemp[0] |= mapIndex[nV];
if(i % 2) pTemp++;
}
if(bmih.biWidth % 2)
{
pTemp[0] <<= 4;
}
} static RGBQUAD bmiColor[16] =
{
{0x00, 0x00, 0x00, 0x00},
{0x00, 0x00, 0x80, 0x00},
{0x00, 0x00, 0xff, 0x00},
{0x00, 0x80, 0x00, 0x00},
{0x00, 0x80, 0x80, 0x00},
{0x00, 0xff, 0x00, 0x00},
{0x00, 0xff, 0xff, 0x00},
{0x80, 0x00, 0x00, 0x00},
{0x80, 0x00, 0x80, 0x00},
{0x80, 0x80, 0x00, 0x00},
{0x80, 0x80, 0x80, 0x00},
{0xff, 0x00, 0x00, 0x00},
{0xff, 0x00, 0xff, 0x00},
{0xff, 0xff, 0x00, 0x00},
{0xff, 0xff, 0xff, 0x00},
{0xc0, 0xc0, 0xc0, 0x00},
}; DWORD dwByteWritten = 0;
::WriteFile(hFile, &bmfh, sizeof(bmfh), &dwByteWritten, NULL);
::WriteFile(hFile, &bmih, sizeof(bmih), &dwByteWritten, NULL);
::WriteFile(hFile, bmiColor, sizeof(bmiColor), &dwByteWritten, NULL);
::WriteFile(hFile, pData, nBitmapSize, &dwByteWritten, NULL); delete[] pData; return TRUE;
}