在C#中将每像素2字节的MONO-16位图像转换为每像素1字节的MONO-16位图像

3
我正在使用C#编程,需要处理一款返回两张连续图像的单色相机。我想对这些图像进行减法运算。
该相机设置为MONO-16格式,分辨率为1980x960。
相机返回一个包含2457600个元素的向量。每个像素由两个字节表示,因此 {1980x960 = 1228800} * 2 bytes / pixel = 2457600
问题是我需要将这两个2457600元素的向量转换为两个1228800元素的向量才能进行减法运算。
因此,我需要将2457600的两个连续元素合并成一个元素,以便得到一个包含1228800个元素的向量。其中每个元素的范围为16位(0-65536)。
我可能需要创建一个循环来迭代1228800次,并在每次迭代中从2457600向量中取出两个元素:
  for(int i = 0 ; i < 2457600 ; i = i + 2)
  {
     byte BYTE1 = newGrabResultInternal2.ImageData.Buffer[i];
     byte BYTE2 = newGrabResultInternal2.ImageData.Buffer[i+1];        
     // What to do next to combine the 2 bytes into one???
  }

当我有两个表示1个像素的字节时,如何将它们组合在一起,以给出深度为16位(0-65536)的强度值?

另外,如果您可以提供不同的方法,那将会很有帮助。


这只是成对图像的情况还是适用于许多图像,例如视频? - user585968
现在只是两个连续的图像。以后我会尝试实时流传输,其中我将获取两个连续的图像并显示一个。 - Spyros
没关系。我只是在阅读 MS WIA,因为可能有一些可以使用本地代码更快完成的东西。我还以为有一个图像 SDK,但可惜找不到了。 - user585968
没问题,无论如何还是谢谢你。thumbmunkeys的解决方案有效,所以我会继续使用它! - Spyros
1个回答

1
你可以使用位运算来实现这个功能:
for(int i=0;i<2457600;i=i+2)
{
  byte BYTE1 = newGrabResultInternal2.ImageData.Buffer[i];
  byte BYTE2 = newGrabResultInternal2.ImageData.Buffer[i+1];        

   int pixel = ((int)BYTE1 << 8) | ((int)BYTE2);
 }

这将把BYTE1向左移动8位,然后与BYTE2结合。
这将使BYTE1成为高位字节,BYTE2成为低位字节。如果你想要反过来,你需要交换它们。

非常感谢您的回答!! - Spyros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接