16,24,32位的位图信息的RGB值比较好读
但是8位图,是记录的调色板索引值,怎么读取出索引值,然后根据索引值取出RGB值呢
谢谢提供思路

解决方案 »

  1.   

    Bitmap myBitmap = new Bitmap(tempImage); for (int i = 0; i < myBitmap.Width; i++)
                {
                    for (int j = 0; j < myBitmap.Height; j++)
                    {
                        Color tempColor = myBitmap.GetPixel(i, j);                    int tempInt=(tempColor.R + tempColor.G + tempColor.B) / 3 ;                    Color c = Color.FromArgb(tempInt, tempInt, tempInt);                    myBitmap.SetPixel(i, j, c);                }
                }
     myBitmap.Save(imageName, System.Drawing.Imaging.ImageFormat.Bmp);
                    myBitmap.Dispose();
      

  2.   

    对于8位位图文件:
    文件开头是文件头
    typedef struct tagBITMAPFILEHEADER { // bmfh 
        WORD    bfType; 
        DWORD   bfSize; 
        WORD    bfReserved1; 
        WORD    bfReserved2; 
        DWORD   bfOffBits; 
    } BITMAPFILEHEADER;
    其中bfOffBits是图像数据相对于文件开始处的偏移量,可以根据这个值定位到图像数据,每个点的值是一个调色板的索引。接下来是位图信息
    typedef struct tagBITMAPINFO {
        BITMAPINFOHEADER    bmiHeader;
        RGBQUAD             bmiColors[1];
    } BITMAPINFO;
    其中bmiColors存放的是调色板,可以把调色板读到一个数组中,然后根据每个点的索引值找到对应的颜色。
    需要注意的问题是,RGBQUAD结构中的颜色顺序是BGR,而不是平常的RGB。 
    typedef struct tagRGBQUAD { // rgbq 
        BYTE    rgbBlue; 
        BYTE    rgbGreen; 
        BYTE    rgbRed; 
        BYTE    rgbReserved; 
    } RGBQUAD;
      

  3.   

    我一般是采用这种方法:将它读到BITMAP里,然后全部按照24位的方法来读。虽然空间稍大一点,但是算法通用,算是开发和运行效率的平衡点吧。