首先讲一下我转灰度图的原因,就是为了减少图片占的体积(32位色的每张图片都上M)
其次有个朋友已经给我提了个类似的解决方法
void ConvertToGray24(CBitmap *pBmp)
{
   LPBYTE lpbits = NULL;
   lpbits = new BYTE[BITS24];
   if (!lpbits)
        return;
   ZeroMemory(lpbits, BITS24);
   pBmp->GetBitmapBits(BITS24, lpbits);
   for (int index = 0, j = 0, k = 0; index < BITS24; index ++)
    {
      lpbits[index] = (BYTE)(0.114 * lpbits[index]);
      j = index + 1; k = index + 2;
      lpbits[j] = (BYTE)(0.587 * lpbits[j]);
      lpbits[k] = (BYTE)(0.299 * lpbits[k]);
      lpbits[index] += lpbits[j] + lpbits[k];
      lpbits[j] = lpbits[index];
      lpbits[k] = lpbits[index];
      index = k;
      }
      pBmp->SetBitmapBits(BITS24, lpbits);
      delete [] lpbits;
}但是我觉得不行,因为他只是把RGB三位都改成了灰度处理过的那个值,并没有减少体积啊....
所以想找个解决的方法(32位--->1位,4位,16位都OK)

解决方案 »

  1.   

    你先了解一下位图结构,应该不很难啊。不过没有特殊要求的花,用现成的例如ACDSee就算了,也可以下到一些图形处理库供程序调用。
      

  2.   

    而且,缩小图形最关键的是压缩,就是改成JPG格式的文件。
      

  3.   

    就是要BMP图,不需要压缩(需求就是这样,我也很无奈),另外是程序实现而非手工,谢谢
    大家不要嫌分少就不进来啊,那可是我仅有的20分啊,我以前向来就是100,100给的,最少也是50
      

  4.   

    伤心啊,没人来,看来CSDN的人都是看分进的啊,郁闷
      

  5.   

    ConvertBmp24ToBmp256
    {
    FILE *fp = fopen("test.bmp","rb");
    if(!fp)return; BITMAPFILEHEADER hdr;

    fread(&hdr,1,sizeof(hdr),fp); if(!(((hdr.bfType & 0xff) == 'B') &&  ((hdr.bfType >> 8) == 'M')))
    {
    fclose(fp);
    return;
    } BITMAPINFOHEADER bih; fread(&bih,1,sizeof(bih),fp); if(bih.biBitCount != 24 || bih.biCompression != 0)
    {
    fclose(fp);
    return;
    } unsigned char *pBuf = new unsigned char[bih.biSizeImage]; fread(pBuf,bih.biSizeImage,sizeof(unsigned char),fp);
    FILE *out = fopen("testout.bmp","wb");
    if(!out)
    {
    delete []pBuf;
    fclose(fp);
    return;
    } unsigned char *pOutBuf = new unsigned char[bih.biWidth * bih.biHeight];
    unsigned char *tmp = pBuf;
    unsigned char *tmp2 = pOutBuf;
    for(unsigned int i = 0; i < bih.biWidth * bih.biHeight;i++)
    {
    tmp2[i] = (unsigned char)((*tmp) * .114 + *(tmp + 1) * .587 + *(tmp + 2) * .299);
    tmp += 3;
    } RGBQUAD q[256];
    for( i = 0; i < 256; i++)
    {
    q[i].rgbRed = q[i].rgbGreen = q[i].rgbBlue = i;
    q[i].rgbReserved = 0;
    } bih.biBitCount = 8;
    bih.biSizeImage = bih.biWidth * bih.biHeight; hdr.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
    + sizeof(q) + bih.biSizeImage;
    hdr.bfOffBits += sizeof(q); fwrite(&hdr,1,sizeof(hdr),out);
    fwrite(&bih,1,sizeof(bih),out);
    fwrite(q,256,sizeof(RGBQUAD),out);
    fwrite(pOutBuf,bih.biSizeImage,sizeof(unsigned char),out); delete []pOutBuf;
    fclose(out);
    delete []pBuf;
    fclose(fp);
    }