高手们,请教位操作?50分送

MarsSoft 2000-08-30 10:28:00
各位高手们,请教小弟一招:我想直接存取DirectDraw页面数据,如何在16位高彩色模式下取得每一个像素的R、G、B值呢?又如何将R、G、B三个值合并生成一个16字节的WORD字呢?如何将24位颜色转换为16位,又16位转换为24,等?
...全文
126 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
Kevin_qing 2000-08-30
  • 打赏
  • 举报
回复
ddsd.dwSize=sizeof(ddsd);
//LPDDSPrimary是指象主表面的指针
LPDDSPrimary->Lock(NULL,&ddsd,DDLOCK_WAIT,0);
WORD color;
color=*((LPWORD)ddsd.lpSurface);
LPDDSPrimary->Unlock(NULL);
現在color是16位的色彩值了。
在565模式下
R=(color&0xf800)>>11;
G=(color&0xfe0)>>5
B=color&0x1f
在555模式下
R=(color&0x7c00)>>10
G=(color&0x3e0)>>5
B=color&0x1f

将前面的RGB按其位数转换了拼成RGB的byte格式就可以了

如16bits555-> 24

用前面的格式分出R16,G16,B16
R24=R16<<3
G24=G16<<3
B24=B16<<3

24->16bits 555
R16=R24>>3
...

24->16bits 565
R16=R24>>3
G16=G24>>2
B16=B24>>3


hoyle 2000-08-30
  • 打赏
  • 举报
回复
对于directdraw来说,使用lock方法和使用getdc方法所取得位图的调色板未必相同,与显卡有关,所以,在很多情况下(尤其是显存较大的情况下),不能简单的利用上面的方法。
如果要使用的话,就一定要用getdc方法。lock方法虽然快,但是却容易出现上面的问题。
我比较过,出现过这种情况。

使用lock方法时
1M显存的显卡上正常(因为显存不够,所以使用内存)
而同样的程序在4M显存的显卡上色彩就出现了偏差

getdc虽然慢一点,但是它根据显卡的情况对调色板进行了修正,所以不会出问题。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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