比如现在有一个色值0xF817怎么得到r,g,b?

解决方案 »

  1.   

    我用笨办法
    16位每5位是一个颜色
    按位读
    用|和& 来读关注好方法
      

  2.   

    把5,6,5bit均匀地映射到8,8,8比特就可以了。
      

  3.   

    void CColorSpaceConvertor::RGBToRGB(
    BYTE * pDest, BYTE * pSrc,
    tPixelFormat formatDest, tPixelFormat formatSrc,
    DWORD dwDestPitch, DWORD dwSrcPitch, UINT nWidth, int nHeight)
    {
    int iAbsHeight = abs(nHeight);
    BITMAPINFOHEADER * pDestFormat = GetBitmapInfo(formatDest);
    LDataBuf bufDestFmt(pDestFormat, GetFormatSize(pDestFormat));
    pDestFormat = (BITMAPINFOHEADER *) bufDestFmt.GetData();
    pDestFormat->biWidth = nWidth;
    pDestFormat->biHeight = 1;
    pDestFormat->biSizeImage = (s_nPixelBytes[formatDest] * nWidth +3) /4 *4; BITMAPINFOHEADER * pSrcFormat = GetBitmapInfo(formatSrc);
    LDataBuf bufSrcFmt(pSrcFormat, GetFormatSize(pSrcFormat));
    pSrcFormat = (BITMAPINFOHEADER *) bufSrcFmt.GetData();
    pSrcFormat->biWidth = nWidth;
    pSrcFormat->biHeight = iAbsHeight;
    pSrcFormat->biSizeImage = (s_nPixelBytes[formatSrc] * nWidth +3) /4 *4 * iAbsHeight; HDC hDC = ::GetDC(0);
    BYTE * pBits;
    HBITMAP hBmp = CreateDIBSection(hDC, (BITMAPINFO*) pSrcFormat, DIB_RGB_COLORS, (void**)&pBits, 0, 0);
    SameFormatConvert(pBits, pSrc, formatSrc, 
    pSrcFormat->biSizeImage / iAbsHeight, dwSrcPitch, nWidth, nHeight);
    for (int i = 0; i < iAbsHeight; i ++)
    {
    GetDIBits(hDC, hBmp, i, 1, pDest, (BITMAPINFO*) pDestFormat, DIB_RGB_COLORS);
    pDest += dwDestPitch;
    }
    ::ReleaseDC(0, hDC);
    ::DeleteObject(hBmp);
    if(NULL!=pBits)delete pBits;
    }
      

  4.   

    RGB555:
    UINT c = ?;
    UINT b =(c << 3) & 0xf8;
    UINT g =(c >> 2) & 0xf8;
    UINT r =(c >> 7) & 0xf8;
    RGB565:
    UINT b =(c << 3) & 0xf8;
    UINT g =(c >> 3) & 0xfc;
    UINT r =(c >> 8) & 0xf8;
      

  5.   

    比如:
    unsigned short rbg16 = 0xF817;int r = ((rgb16 & 0xF800) >> 11) * 256 / 32;
    int g = ((rgb16 & 0x07E0) >> 5) * 256 / 64;
    int b = (rgb16 & 0x001F) * 256 / 32;
      

  6.   

    下面分别介绍各种RGB格式。¨ RGB1、RGB4、RGB8都是调色板类型的RGB格式,在描述这些媒体类型的格式细节时,通常会在BITMAPINFOHEADER数据结构后面跟着一个调色板(定义一系列颜色)。它们的图像数据并不是真正的颜色值,而是当前像素颜色值在调色板中的索引。以RGB1(2色位图)为例,比如它的调色板中定义的两种颜色值依次为0x000000(黑色)和0xFFFFFF(白色),那么图像数据001101010111…(每个像素用1位表示)表示对应各像素的颜色为:黑黑白白黑白黑白黑白白白…。¨ RGB565使用16位表示一个像素,这16位中的5位用于R,6位用于G,5位用于B。程序中通常使用一个字(WORD,一个字等于两个字节)来操作一个像素。当读出一个像素后,这个字的各个位意义如下:
         高字节              低字节
    R R R R R G G G     G G G B B B B B
    可以组合使用屏蔽字和移位操作来得到RGB各分量的值:#define RGB565_MASK_RED    0xF800
    #define RGB565_MASK_GREEN  0x07E0
    #define RGB565_MASK_BLUE   0x001F
    R = (wPixel & RGB565_MASK_RED) >> 11;   // 取值范围0-31
    G = (wPixel & RGB565_MASK_GREEN) >> 5;  // 取值范围0-63
    B =  wPixel & RGB565_MASK_BLUE;         // 取值范围0-31¨ RGB555是另一种16位的RGB格式,RGB分量都用5位表示(剩下的1位不用)。使用一个字读出一个像素后,这个字的各个位意义如下:
         高字节             低字节
    X R R R R G G       G G G B B B B B       (X表示不用,可以忽略)
    可以组合使用屏蔽字和移位操作来得到RGB各分量的值:#define RGB555_MASK_RED    0x7C00
    #define RGB555_MASK_GREEN  0x03E0
    #define RGB555_MASK_BLUE   0x001F
    R = (wPixel & RGB555_MASK_RED) >> 10;   // 取值范围0-31
    G = (wPixel & RGB555_MASK_GREEN) >> 5;  // 取值范围0-31
    B =  wPixel & RGB555_MASK_BLUE;         // 取值范围0-31¨ RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。注意在内存中RGB各分量的排列顺序为:BGR BGR BGR…。通常可以使用RGBTRIPLE数据结构来操作一个像素,它的定义为:typedef struct tagRGBTRIPLE { 
      BYTE rgbtBlue;    // 蓝色分量
      BYTE rgbtGreen;   // 绿色分量
      BYTE rgbtRed;     // 红色分量
    } RGBTRIPLE;¨ RGB32使用32位来表示一个像素,RGB分量各用去8位,剩下的8位用作Alpha通道或者不用。(ARGB32就是带Alpha通道的RGB32。)注意在内存中RGB各分量的排列顺序为:BGRA BGRA BGRA…。通常可以使用RGBQUAD数据结构来操作一个像素,它的定义为:typedef struct tagRGBQUAD {
      BYTE    rgbBlue;      // 蓝色分量
      BYTE    rgbGreen;     // 绿色分量
      BYTE    rgbRed;       // 红色分量
      BYTE    rgbReserved;  // 保留字节(用作Alpha通道或忽略)
    } RGBQUAD;
      

  7.   

    下面介绍各种YUV格式。YUV格式通常有两大类:打包(packed)格式和平面(planar)格式。前者将YUV分量存放在同一个数组中,通常是几个相邻的像素组成一个宏像素(macro-pixel);而后者使用三个数组分开存放YUV三个分量,就像是一个三维平面一样。表2.3中的YUY2到Y211都是打包格式,而IF09到YVU9都是平面格式。(注意:在介绍各种具体格式时,YUV各分量都会带有下标,如Y0、U0、V0表示第一个像素的YUV分量,Y1、U1、V1表示第二个像素的YUV分量,以此类推。)¨ YUY2(和YUYV)格式为每个像素保留Y分量,而UV分量在水平方向上每两个像素采样一次。一个宏像素为4个字节,实际表示2个像素。(4:2:2的意思为一个宏像素中有4个Y分量、2个U分量和2个V分量。)图像数据中YUV分量排列顺序如下:
    Y0 U0 Y1 V0    Y2 U2 Y3 V2 …¨ YVYU格式跟YUY2类似,只是图像数据中YUV分量的排列顺序有所不同:
    Y0 V0 Y1 U0    Y2 V2 Y3 U2 …¨ UYVY格式跟YUY2类似,只是图像数据中YUV分量的排列顺序有所不同:
    U0 Y0 V0 Y1    U2 Y2 V2 Y3 …¨ AYUV格式带有一个Alpha通道,并且为每个像素都提取YUV分量,图像数据格式如下:
    A0 Y0 U0 V0    A1 Y1 U1 V1 …¨ Y41P(和Y411)格式为每个像素保留Y分量,而UV分量在水平方向上每4个像素采样一次。一个宏像素为12个字节,实际表示8个像素。图像数据中YUV分量排列顺序如下:
    U0 Y0 V0 Y1    U4 Y2 V4 Y3    Y4 Y5 Y6 Y8 … ¨ Y211格式在水平方向上Y分量每2个像素采样一次,而UV分量每4个像素采样一次。一个宏像素为4个字节,实际表示4个像素。图像数据中YUV分量排列顺序如下:
    Y0 U0 Y2 V0    Y4 U4 Y6 V4 …¨ YVU9格式为每个像素都提取Y分量,而在UV分量的提取时,首先将图像分成若干个4 x 4的宏块,然后每个宏块提取一个U分量和一个V分量。图像数据存储时,首先是整幅图像的Y分量数组,然后就跟着U分量数组,以及V分量数组。IF09格式与YVU9类似。¨ IYUV格式为每个像素都提取Y分量,而在UV分量的提取时,首先将图像分成若干个2 x 2的宏块,然后每个宏块提取一个U分量和一个V分量。YV12格式与IYUV类似。¨ YUV411、YUV420格式多见于DV数据中,前者用于NTSC制,后者用于PAL制。YUV411为每个像素都提取Y分量,而UV分量在水平方向上每4个像素采样一次。YUV420并非V分量采样为0,而是跟YUV411相比,在水平方向上提高一倍色差采样频率,在垂直方向上以U/V间隔的方式减小一半色差采样,如图2.12所示。
      

  8.   

    #define GETRGB555( a, b, c, d ) { WORD *wData = (WORD *) d; a = (unsigned char) ( ( (*wData) & 0x7c00 ) >> 7 ); b = (unsigned char) ( ( (*wData) & 0x03e0 ) >> 2 ); c = (unsigned char) ( ( (*wData) & 0x001f ) << 3 ); }
    #define GETRGB565( a, b, c, d ) { WORD *wData = (WORD *) d; a = (unsigned char) ( ( (*wData) & 0xf800 ) >> 8 ); b = (unsigned char) ( ( (*wData) & 0x07e0 ) >> 3 ); c = (unsigned char) ( ( (*wData) & 0x001f ) << 3 ); }
    #define GETRGB888( a, b, c, d ) { DWORD *dwData = (DWORD *) d; a = (unsigned char) ( (*dwData) >> 16 ); b = (unsigned char) ( ( (*dwData) & 0x0000ff00 ) >> 8 ); c = (unsigned char) ( (*dwData) & 0x000000ff ); }#define PUTRGB555( a, b, c, d ) { WORD *wData = (WORD *) d; *wData = ( ( ( (WORD) a & 0x00f8 ) << 7 ) | ( ( (WORD) b & 0x00f8 ) << 2 ) | ( (WORD) c >> 3 ) ); }
    #define PUTRGB565( a, b, c, d ) { WORD *wData = (WORD *) d; *wData = ( ( ( (WORD) a & 0x00f8 ) << 8 ) | ( ( (WORD) b & 0x00fc ) << 3 ) | ( (WORD) c >> 3 ) ); }
    #define PUTRGB888( a, b, c, d ) { DWORD *dwData = (DWORD *) d; *dwData = ( (DWORD) a << 16 ) | ( (DWORD) b << 8 ) | (DWORD) c; }#define _RGB(r,g,b) (WORD)(((b)&~7)<<7)|(((g)&~7)<<2)|((r)>>3)