首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

,位图24位转16位不解之处

2012-01-20 
求助,位图24位转16位不解之处// process each line and copy it into the primary bufferfor (int index_y

求助,位图24位转16位不解之处
// process each line and copy it into the primary buffer
for (int index_y = 0; index_y < SCREEN_HEIGHT; index_y++)
  {
  for (int index_x = 0; index_x < SCREEN_WIDTH; index_x++)
  {
  // get BGR values, note the scaling down of the channels, so that they
  // fit into the 5.6.5 format
  UCHAR blue = (bitmap.buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 0]) >> 3,
  green = (bitmap.buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 1]) >> 3,
  red = (bitmap.buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 2]) >> 3;

  // this builds a 16 bit color value in 5.6.5 format (green dominant mode)
  USHORT pixel = _RGB16BIT565(red,green,blue);

  // write the pixel
  primary_buffer[index_x + (index_y*ddsd.lPitch >> 1)] = pixel;

  } // end for index_x

  } // end for index_y


加载进的24位位图存在bitmap里,位图大小与屏幕大小一致。每像素转16位后刷到屏幕缓存里。
请问
blue = (bitmap.buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 0]) >> 3;
为什么要右移三位?


相关定义如下:
typedef unsigned char UCHAR;
typedef unsigned short USHORT;

// this builds a 16 bit color value in 5.6.5 format (green dominate mode)
#define _RGB16BIT565(r,g,b) ((b & 31) + ((g & 63) << 5) + ((r & 31) << 11))

// container structure for bitmaps .BMP file
typedef struct BITMAP_FILE_TAG
  {
  BITMAPFILEHEADER bitmapfileheader; // this contains the bitmapfile header
  BITMAPINFOHEADER bitmapinfoheader; // this is all the info including the palette
  PALETTEENTRY palette[256]; // we will store the palette here
  UCHAR *buffer; // this is a pointer to the data

  } BITMAP_FILE, *BITMAP_FILE_PTR;


谢谢!

[解决办法]
'RGB16BIT565',也就是3个8位(24)要变成 5,6,5位。这样就可以在16位中表示(5+6+5)
[解决办法]
试试移两位,RGB16bit有两种模式565和555

热点排行