16位图像在vc++中显示(高手进)

xmu_mickey 2008-03-21 02:50:42
本人现在在做一个图像处理的project,对于8位灰度图像处理比较好显示,当时处理16位图像显示时(像素是自己生成的)不知道怎么显示。比如现在有一个16位的像素值(11111111 11111111),如果显示的时候要采用(R G B)中的(R 和 G)两种颜色,也就是(11111111 11111111)显示的应该是(红 绿),请教应该怎么来显示。。。?
...全文
208 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmu_mickey 2008-03-21
  • 打赏
  • 举报
回复
1、 对啊,(11111111 11111111)是红绿的混合,我想显示的就是前8位用(0~255)的红色,后8位用(0~255)的绿色,
2、16位图像的调色版在vc里面是自己生成的吧,那么我想在想给16位图像是(255红+255绿)的颜色是16位的值是什么?
ryfdizuo 2008-03-21
  • 打赏
  • 举报
回复
16位的话可以用RGB565或者RGB555表示,
Supper_Jerry 2008-03-21
  • 打赏
  • 举报
回复
16位的像素是如下分的:
蓝:0-4 绿:5-10 红:11-15
当然也有565这样分的
你要变成32位的话也很简单
32位是也用索引的结构体
typedef struct tagRGBQUAD { // rgbq
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
Members
rgbBlue
Specifies the intensity of blue in the color.
rgbGreen
Specifies the intensity of green in the color.
rgbRed
Specifies the intensity of red in the color.
rgbReserved
Reserved; must be zero.
最后2位表示通道,在有透明通道时候使用
用你从16位得到的颜色数去填这个结构体
ryfdizuo 2008-03-21
  • 打赏
  • 举报
回复
各种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。
Supper_Jerry 2008-03-21
  • 打赏
  • 举报
回复
呵呵 有转换算法的。搜索一下32位转换成16位算法
dubiousway 2008-03-21
  • 打赏
  • 举报
回复
16位的图像的数据 值不是像素(颜色)值,是索引值。

你先看看bmp 的文件结构吧。
图像信息头后面有调色版,这个索引值是调色版项的编号,颜色在调色板里
Supper_Jerry 2008-03-21
  • 打赏
  • 举报
回复
b弄成0
独孤过儿 2008-03-21
  • 打赏
  • 举报
回复
怎么没明白楼主的意思呢...如果一个16位的像素值(11111111 11111111),那它的显示颜色应该是红和绿的混合啊!

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧