• 7337阅读
  • 6回复

求建议。关于RGB的问题 [复制链接]

上一主题 下一主题
离线liyayao
 

只看楼主 正序阅读 楼主  发表于: 2010-07-27
我从摄像头那里得到了16位RGB图。
一种颜色用两个字节 e 和 f  颜色是按照 5-6-5  RRRRRGGG GGGBBBBB 排的

                        QRgb value;
                        b=e&0x1f;  
                        g=(e>>5)|((f<<3)&0x38);
                        r=f>>3;
                        value = qRgb(r,g ,b);            

                      image.setPixel(0, 0, value);
这个value是颜色的值。但出现了不正确的颜色。不知道为什么。。。。。。。。。
如果我把改成

            QRgb value;
                        b=(e&0x1f)*8;   //565
                        g=((e>>5)|((f<<3)&0x38))*4;
                        r=(f>>3)*8;
                        value = qRgb(r,g ,b);

                       image.setPixel(0, 0, value);

这样颜色就会好很多,但也不是很好。这个是网上听说的,这方法是从16位转24位,
但会失真
是不是qRGB()就是能合成24位,不能合成16位的颜色呢

没有办法呢

求建议。。。。。。。。。。。

                      



                        
                    
                
离线liyayao

只看该作者 6楼 发表于: 2010-07-27
回 2楼(dbzhang800) 的帖子
我得到的数据是像这样的:F5 65 98 12 C2 12 45。。。。。。
e=F5   f=65
然后从e和f 中获得一个颜色
QRgb value;
                        b=e&0x1f;  
                        g=(e>>5)|((f<<3)&0x38);
                        r=f>>3;
                        value = qRgb(r,g ,b);            

                      image.setPixel(0, 0, value);

然后又从
e=98 f=12获得一个颜色QRgb value;
                        b=e&0x1f;  
                        g=(e>>5)|((f<<3)&0x38);
                        r=f>>3;
                        value = qRgb(r,g ,b);            

                      image.setPixel(0, 1, value);
.......

我理解16位和24位

但就是这样做出现问题了,出来的图像偏绿色



离线liyayao

只看该作者 5楼 发表于: 2010-07-27
回 1楼(sbtree) 的帖子
我说的是,我得到的是一字节一字节的数据,两个字节就是16位,。。。是你搞乱了
离线sbtree
只看该作者 4楼 发表于: 2010-07-27
引用第3楼dbzhang800于2010-07-27 18:08发表的  :
不小心就会有 字节序 问题

如果位图文件是从其它操作系统拷贝过来的或者通过网络传递过来的,有可能存在字节序的问题,但这个问题不是在这个层面上能讨论的,最好在分析数据包时候就解决掉。
到目前为止我只是在跨操作系统间通讯的时候处理过这个问题。
windows 7 + VC++2008 + Qt4.5.2
离线dbzhang800

只看该作者 3楼 发表于: 2010-07-27
引用第1楼sbtree于2010-07-27 17:35发表的  :
这只要进行位操作,从16bit的值中分别取出3种颜色的值,再合成就可以了吧,没看到更多的技巧和技术
QRgb value;
                        int b=(e&0x1f); // e is a 16-bit value, format : 5-6-5  RRRRRGGG GGGBBBBB
                        int g=((e&0x5e) >>5);
                        int r=((e&0xf8)>>11);
.......

不小心就会有 字节序 问题
离线dbzhang800

只看该作者 2楼 发表于: 2010-07-27
引用楼主liyayao于2010-07-27 16:46发表的 求建议。关于RGB的问题 :
我从摄像头那里得到了16位RGB图。
一种颜色用两个字节 e 和 f  颜色是按照 5-6-5  RRRRRGGG GGGBBBBB 排的
                        QRgb value;
                        b=e&0x1f;  
.......


不清楚你想做什么。随便说两句,如不当勿怪。

首先,你所谓的16位颜色是什么?24位又是什么呢?

其次,个人理解,你转换之前不就是 16 位么 ?

再次,QRgb 只是个别名!
  1. typedef unsigned int  QRgb

离线sbtree
只看该作者 1楼 发表于: 2010-07-27
这只要进行位操作,从16bit的值中分别取出3种颜色的值,再合成就可以了吧,没看到更多的技巧和技术
QRgb value;
                        int b=(e&0x1f); // e is a 16-bit value, format : 5-6-5  RRRRRGGG GGGBBBBB
                        int g=((e&0x5e) >>5);
                        int r=((e&0xf8)>>11);
                       QRgb rgb = qRgb(r,g ,b);

                       image.setPixel(0, 0, rgb);
没看懂你的程序中为什么还有一个变量f。看上去你好像把两个颜色值混合起来了
windows 7 + VC++2008 + Qt4.5.2
快速回复
限100 字节
 
上一个 下一个