PVOID ptr;
  ptr = CaptureSingle(xxxx);//采集一幅图像
  unsigned char* pcolor = (unsigned char*)ptr;
    查看了下,指针指向内存的内容为16进制的,1个字节一个子像素
  接下来 我该如何把内存中的RGB值放在RGB()这个宏中??
  对于指针里面的内容我不知道该如何取出,而且为0到255的值。
  

解决方案 »

  1.   

    如果没有头,只有颜色数据的话,而且是24位即3个字节表示一个像素颜色,还有一个条件,它是按照微软的格式排列的话,则:
    开始的数据对应图像后面的数据,即首先保存的是图像最后一行的颜色,然后再保存倒数第二行,倒数第三行,... ,第一行
    每一行是从左到右保存的,每个像素的颜色分别是r、g、b,即第一个字节是红色,第二个字节是绿色,第三个字节是蓝色,一行的数据像下面这样
    r1g1b1r2g2b2r3g3b3...总体的图像如下(假设总行数为y,总列数为x):r(y1)g(y1)b(y1)r(y2)g(y2)b(y2) ... r(yx)g(yx)b(yx)
    ... ...
    r(21)g(21)b(21)r(22)g(22)b(22) ... r(2x)g(2x)b(2x)
    r(11)g(11)b(11)r(12)g(12)b(12) ... r(1x)g(1x)b(1x)
      

  2.   

     1、如果图像是RGB24位的。
     PVOID ptr; 
     ptr = CaptureSingle(xxxx);//采集一幅图像 
     unsigned char * pcolor = (unsigned char*)ptr; 
     RGB m_rgb(pcolor >> 16;pcolor++ >> 8;pcolor++);
     RGB m_rgb1(pcolor++ >> 16;pcolor++ >> 8;pcolor++);
     依次类推,知道pcolor移动到 ptr的结尾。
     
     2、如果图像是RGB32位的。
     PVOID ptr; 
     ptr = CaptureSingle(xxxx);//采集一幅图像 
     unsigned char * pcolor = (unsigned char*)ptr; 
     RGB m_rgb(pcolor >> 24;pcolor++ >> 16;pcolor++ >>8);
     pcolor++//跳过alpha字节。
     RGB m_rgb1(pcolor++ >> 24;pcolor++ >> 16;pcolor++ >>8);
     pcolor++//跳过alpha字节。
     依次类推,知道pcolor移动到 ptr的结尾。 3、如果图像是16位灰度图。
     PVOID ptr; 
     ptr = CaptureSingle(xxxx);//采集一幅图像 
     unsigned char * pcolor = (unsigned char*)ptr; 
     RGB m_rgb(pcolor >> 8;((pcolor++) & 0x1100) >> 2;((pcolor++) & 0x11) );
     RGB m_rgb1(pcolor++ >> 8;((pcolor++) & 0x1100) >> 2;((pcolor++) & 0x11) );
     依次类推,知道pcolor移动到 ptr的结尾。
      

  3.   

    注意有的图像是BGR格式的,呵呵!
      

  4.   

    更正:
    跳过alpha字节 --》跳过alpha bit
      

  5.   

    进行几次验证就可以了,比如第一个象素数据:占字节数(3还是4字节),RGB分量排列顺序,行结束(有无标志)。用一副图象来手工验证就行了。