更新时间:2024-01-20 22:25
RGB 555是一种16位的颜色格式。
RGB 555
每个像素由两个字节表示。字符555表示每个颜色值所使用的位数。在这种情况下,每个颜色值使用5位,所以只需要15位。最后一位(最重要的位)是未使用的。图像缓冲区中像素的组织是从左到右和从下到上。
内存布局
此处为图1
如上所述,单词的5个最不重要位对应于蓝色值,位5-9对应绿色值,位10至14对应于红色值。在这种情况下,第15位是未使用的。请注意,在x86体系结构上,单词是按小字节顺序存储的,这意味着首先保存的是低字节。当使用字节指针访问图像数据时,这一点很重要。
如何读写像素数据
必须首先设置视频捕获设备、视频格式、具有MemBufferCollection的FrameHandlerSink,它定义了图像数据颜色格式。下面的代码片段显示了如何一步一步地访问和操作RGB 555的像素数据。
首先,我们必须捕捉一个图像。否则,图像缓冲区将为空。为此,我们启动实时模式并调用Grabber::快照。
访问缓冲区
以下代码检索指向图像数据的指针。请注意,getPtr()返回一个字节指针,该指针将被类型转换为一个Word指针。这使得访问像素数据更加容易。
Word*pwImgData=(word*)pActiveBuf->getPtr();
在本例中,我们希望输出图像的第一个(左上)像素,并操作前3个像素。正如前面提到的,图像数据是自下而上存储的。因此,pwImgData指向缓冲区中最后一行的第一个像素的第一个字节。要访问第一个字节,必须执行以下计算:
//计算左上角像素的索引
//图像倒置存储在图像缓冲区中
//*1:像素为2字节,但由于我们有一个字指针(也是2个字节)
//我们以像素计算,而不是以字节为单位
大小为DIM=pActiveBuf->getFrameType().DIM;
INT ioffsUpperLeft=(dim.cy-1)*dim.cx*1;
首先,我们以像素的形式检索图像的宽度和高度。然后,计算到左上角像素的偏移量。请注意,我们用宽度*1而不是宽度*2进行乘法。这是因为我们使用一个字指针来访问图像数据。当然,乘1的乘法只是为了说明,可以忽略不计。
(高度-1)*宽度
既然我们有了第一个像素的偏移量,我们就可以读出它了:
//请注意:RGB值按以下顺序存储在一个单词中:r、G、B
//一个二进制文件,并使用颜色掩码进行操作以提取特定颜色。
//在AND操作之后,进行右移位,以便正确显示输出。
Printf(“ 图像缓冲像素格式为eRGB 555 ”);
Printf(“Pixel 1(RGB):%d%d%d ”,(pwImgData[iOffsUpperLeft]&eRGB 555_R)>10,
(pwImgData[iOffsUpperLeft]&eRGB 555_G)>>5,
(pwImgData[iOffsUpperLeft]&eRGB 555_B);
Printf(“Pixel 2(RGB):%d%d%d ”,(pwImgData[ioffsUpperLeft+1]&eRGB 555_R)>10,
(pwImgData[iOffsUpperLeft+1]&eRGB 555_G)>>5,
(pwImgData[iOffsUpperLeft+1]&eRGB 555_B);
如上面的代码所示,我们执行一个二进制操作,并在当前像素上使用适当的像素掩码来提取颜色值。在此之后,必须将红色和绿色的值右移以获得正确的值(否则值将为1024(32倍))。
操纵图像数据
在分配值时,移位也很重要。例如,如果将7赋值给红色值,则必须向左移动10次。而不是写:
//将7赋值为红色
PwImgData[iOffsUpperLeft]=7;//这是错误的
如果将7赋值为蓝色值,则应使用以下代码:
//将7赋值为红色
PwImgData[iOffsUpperLeft]=7<10;
另一个重要的注意事项是,上面的赋值将覆盖绿色和蓝色的值。为了防止这种情况,必须将该值安装到像素数据,如下代码所示:
//清除红色值(将所有位设置为0)
PwImgData[iOffsUpperLeft]&=~eRGB 555_R;
//将7赋值为红色值,而不覆盖绿色和蓝色值
PwImgData[iOffsUpperLeft]x=7<10;
请注意,所有适当颜色的位都应该设置为0,就像上面的代码一样。例如,考虑到以前的红色值可能是16(或10000二进制)。如果我们使用7(或111个二进制)执行二进制或操作,结果将是23(或10111二进制)。因此,最好将适当信道的所有位设置为0。
现在,我们将左上角像素设置为红色,下一个像素设置为绿色,第三个像素设置为蓝色。
//覆盖前3个像素并将图像保存到磁盘
//将第一个像素设置为红色
PwImgData[iOffsUpperLeft]=0;//清除像素
PwImgData[iOffsUpperLeft]AC.26=31<<10;//为red赋值
//将第二个像素设置为绿色
PwImgData[iOffsUpperLeft+1]=0;//清除像素
PwImgData[iOffsUpperLeft+1]AC.26=31<5;//为Green赋值
//将第三个像素设置为蓝色
PwImgData[iOffsUpperLeft+2]=0;//清除像素
PwImgData[iOffsUpperLeft+2]AC.26=31;//为Blue赋值
PActiveBuf->Save(“RGB 555.bmp”);
要检查结果,只需打开保存的图像并检查左上角像素。它们应如下所示:
此处为图2