《windows游戏编程大师技巧》中碰到的问题!

whbc1 2011-07-08 07:24:29
本人最近在学习《windows编程大师技巧》,在第七章遇到几个问题,向各位大侠求解!
1.书中有载入16位位图这个小节。他说把24位图像装载到你的BITMAP_FILE结构中,而后读取缓冲,用下面得算法是想把24位色彩转换为16位!
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);
首先他这里为什么先乘以3然后有分别有加0,加1,加2,最后又向右移3位?这里是不懂的地方!是变成相邻的三个字节吗?还是?
2.在载入24位位图的时候,书上说许多图像卡支持32位图像但不支持24位图像,因为他们不喜欢奇数(3的奇数)地址。这里为什么是奇数?
...全文
112 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
nightkids_008 2011-07-08
  • 打赏
  • 举报
回复
晕倒。。我说的不是一个意思么?
whbc1 2011-07-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhao4zhong1 的回复:]
假如SCREEN_HEIGHT==2,SCREEN_WIDTH=3,那么
BGR,BGR,BGR
BGR,BGR,BGR

(index_y==1,index_x==1)的G分量所在字节偏移量为
index_y*SCREEN_WIDTH*3 + index_x*3 + 1
==1*3*3+1*3+1
==13
[/Quote]
对了,还要问你一个问题,就是 primary_buffer[index_x + (index_y*ddsd.lPitch >> 1)] = pixel
他那个里面的右移是除以2,是转换为像素吗?
科比布莱恩特 2011-07-08
  • 打赏
  • 举报
回复
早就支持32位了,现在连bmp的32位图都带alphi通道了。
whbc1 2011-07-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zhao4zhong1 的回复:]
假如SCREEN_HEIGHT==2,SCREEN_WIDTH=3,那么
BGR,BGR,BGR
BGR,BGR,BGR

(index_y==1,index_x==1)的G分量所在字节偏移量为
index_y*SCREEN_WIDTH*3 + index_x*3 + 1
==1*3*3+1*3+1
==13
[/Quote]
谢谢啊!那后面的那个右移是怎么回事啊?
赵4老师 2011-07-08
  • 打赏
  • 举报
回复
假如SCREEN_HEIGHT==2,SCREEN_WIDTH=3,那么
BGR,BGR,BGR
BGR,BGR,BGR

(index_y==1,index_x==1)的G分量所在字节偏移量为
index_y*SCREEN_WIDTH*3 + index_x*3 + 1
==1*3*3+1*3+1
==13
huanglei2 2011-07-08
  • 打赏
  • 举报
回复
赵中大哥 那个领域都会啊 真牛!
赵4老师 2011-07-08
  • 打赏
  • 举报
回复
BBBBBbbb,GGGGGGgg,RRRRRrrr→BBBBBGGGGGGRRRRR

green = (bitmap.buffer[index_y*SCREEN_WIDTH*3 + index_x*3 + 1]) >> 32,
nightkids_008 2011-07-08
  • 打赏
  • 举报
回复
因为RGB的每一个占8位,共24位,右移3位是为了到下一个像素,+0,+1,+2,是为了取得对应的RGB的值。2、因为系统是32bit的。
ANT2AUNTH 2011-07-08
  • 打赏
  • 举报
回复
路过、、
赵4老师 2011-07-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 whbc1 的回复:]
引用 4 楼 zhao4zhong1 的回复:
假如SCREEN_HEIGHT==2,SCREEN_WIDTH=3,那么
BGR,BGR,BGR
BGR,BGR,BGR

(index_y==1,index_x==1)的G分量所在字节偏移量为
index_y*SCREEN_WIDTH*3 + index_x*3 + 1
==1*3*3+1*3+1
==13

谢谢啊!那后面的那个右移是怎么回事啊?
[/Quote]
参考2楼

64,647

社区成员

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

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