我要做一个程序将主表面的部分内容截取并加工后显示在覆盖表面
而主表面创建时不能指定像素格式(刚学DX,不知道是不是这样,如果有错误请更正),通过调试可以看到它创建的是RGB565的
而覆盖表面不能创建RGB的(运行DXSDK附带的OVERLAY演示时也是如此,请顺便告诉我下如何获得显卡支持哪些像素格式覆盖表面的信息),但可以创建YUY2的,但直接Blt后颜色显示不正常(废话,格式都不同),白色显示为粉色,黑色显示为绿色
望高手们帮我解决,最好就是能告知如何创建格式一样的主表面和覆盖表面,这样的话性能也不会损失
实在不行的话告诉我RGB-〉YUY2的转换算法我自己来转换
这个问题烦着好几天了,急!!!分不多,全部100送上

解决方案 »

  1.   

    http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=1247
      

  2.   

    谢谢,那篇文章我也搜到过了,但是照那个公式达不到想要的结果,不知道是不是因为前面有一句“RGB取值范围均为0-255”,如果是这个原因的话是不是只要按比例缩放一下从RGB像素信息中取得的RGB值就可以了?暂时还没试
    有过实际经验的大虾来帮忙啊
      

  3.   

    一般来说多数显示都只支持YUYV或UVYV格式的overlay平面。
    从RGB转换到YUYV/UVYV有很大的优化空间,可以在网上找个xvid(是开源的)的源码,里面有各种格式的RGB与YUV格式的转换代码(C++和MMX asm)。
      

  4.   

    你从RGB565得到的RGB难道不是0-255的?
      

  5.   

    rgb565中R,G,B的算法不对
    #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
      

  6.   

    那么正确的提取RGB值应该怎么做呢,而且公式真的有点不解,因为如果这样的话一个黑色的像素(全零)转换以后还是全零,但是全零显示出来就是绿色啊
      

  7.   

    为什么只有极少数地方的公式提到y后面要加16,u和v后面要加128呢,但是只有加了以后黑色才能显示正常,但是始终还是不能显示白色,我手动把像素改为0X80FF显示出来的也不是纯白,干脆谁直接告诉我白色的YUYV值应该是多少得了
    现在终于找到合理一点的公式,但是颜色还是有一定的失真,不知道问题出在哪
    PS:既然叫RGB565那么提取出来的RGB范围就应该是5位6位5位,也就是说那篇文章里的提取方法是正确的,我在使用中是把值分别乘8、4、8,不知道这样对不对,感觉精度会损失,但是就如我前面说的,主表面的像素格式我也改不了啊(是不是这样,还没人回答呢),否则就用24位的了
    没有人提供更多的信息了吗,再看看没有的话只能先给上面几位结了