画图工具打开一个24位bmp文件后,另存为时用,16色位图保存,然后就会发现保存的文件不是黑白,而是有色彩的
我要的就是失去大量颜色的图啊,也就是16色位图,谁能给个完整的代码列子

解决方案 »

  1.   

    //BITMAPINFOHEADER m_bmih; // 图像信息
    //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;
    }