这样的, 你需要确定你的16位图形的格式, 如果使用非压缩格式, 一般是555最后一位保留, 否则就是565, 需要获得三个RGB掩码然后同565进行与操作得到需要的RGB, 这个自然需要进行一些移位操作.biBitCount=16 表示位图最多有216种颜色。每个色素用16位(2个字节)表示。这种格式叫作高彩色,或叫增强型16位色,或64K色。它的情况比较复杂,当biCompression成员的值是BI_RGB时,它没有调色板。16位中,最低的5位表示蓝色分量,中间的5位表示绿色分量,高的5位表示红色分量,一共占用了15位,最高的一位保留,设为0。这种格式也被称作555 16位位图。如果biCompression成员的值是BI_BITFIELDS,那么情况就复杂了,首先是原来调色板的位置被三个DWORD变量占据,称为红、绿、蓝掩码。分别用于描述红、绿、蓝分量在16位中所占的位置。在Windows 95(或98)中,系统可接受两种格式的位域:555和565,在555格式下,红、绿、蓝的掩码分别是:0x7C00、0x03E0、0x001F,而在565格式下,它们则分别为:0xF800、0x07E0、0x001F。你在读取一个像素之后,可以分别用掩码“与”上像素值,从而提取出想要的颜色分量(当然还要再经过适当的左右移操作)。在NT系统中,则没有格式限制,只不过要求掩码之间不能有重叠。(注:这种格式的图像使用起来是比较麻烦的,不过因为它的显示效果接近于真彩,而图像数据又比真彩图像小的多,所以,它更多的被用于游戏软件)。这三个掩码反正只要不重复就可以

解决方案 »

  1.   

    这么复杂!
    我现在可以确定的是:这是一幅灰度图像,非标准格式。
    所以根本就没有biBitCount,biCompression标准的bmp标示。
    它的文件头很简单,如下:
    ST-8 Image
    File_version = 3
    Data_version = 1
    Exposure = 11
    Focal_length = 80.000
    Aperture = 43.1969
    Response_factor = 3000.000
    Note = 
    Background = 0
    Range = 19870
    Height = 1020
    Width = 1530
    Date = 03/05/102
    Time = 16:08:56
    Exposure_state = 293
    Temperature = 0.19
    Number_exposures = 1
    Each_exposure = 11
    History = R
    Observer = Observer's Name
    X_pixel_size = 0.0090
    Y_pixel_size = 0.0090
    Pedestal = 0
    E_gain = 2.30
    User_1 = CCDOPS for Windows Version 4.03
    User_2 = -
    User_3 = -
    User_4 = -
    Filter = None
    Readout_mode = 0
    Track_time = 0
    Sat_level = 65535
    End
    用记事本就可以看到。接下来的就是像素矩阵。它肯定没有压缩,这个我知道。
    你说的掩码就是分别提取16位数据的5位吧。我也想过这一点,可根据
    读出的像素值,若分别提取五位rgb值,他们显然是不相等的,这样就不是
    灰度图像了,而它肯定是灰度图像,因为我有软件可以打开它。