从char[]缓冲区在C#中创建位图 我必须将我的C++项目与一个C项目联系起来,并通过一个命名管道发送一个图像给它。OpenCV将矩阵数据存储在连续块中,从uchar*Mat::data开始。然而,要通过命名管道发送数据,它必须是一个char*,所以我只是执行一个cast,不确定我还应该做什么。没关系,只是数据,不是字符 size_t s = frame2.elemSize() * frame2.rows * frame2.cols; sendChars(hPipe, (char*)frame2.data, s);

从char[]缓冲区在C#中创建位图 我必须将我的C++项目与一个C项目联系起来,并通过一个命名管道发送一个图像给它。OpenCV将矩阵数据存储在连续块中,从uchar*Mat::data开始。然而,要通过命名管道发送数据,它必须是一个char*,所以我只是执行一个cast,不确定我还应该做什么。没关系,只是数据,不是字符 size_t s = frame2.elemSize() * frame2.rows * frame2.cols; sendChars(hPipe, (char*)frame2.data, s);,c#,c++,opencv,named-pipes,C#,C++,Opencv,Named Pipes,在C端,我将数据块读入一个char[]缓冲区。然后,我创建一个具有适当宽度、高度等的新的位图,并将IntPtr设置为char[]缓冲区的开头 //in the C# forms private scope: char[] buffer = new char[921600]; 然后在StartServer()函数中: pipeServer = new NamedPipeServerStream("SamplePipe", PipeDirection.InOut); //

在C端,我将数据块读入一个
char[]
缓冲区。然后,我创建一个具有适当宽度、高度等的新的
位图
,并将IntPtr设置为
char[]缓冲区的开头

  //in the C# forms private scope:
  char[] buffer = new char[921600]; 
然后在
StartServer()
函数中:

    pipeServer = new NamedPipeServerStream("SamplePipe", PipeDirection.InOut);
    //blah blah blah
    using (StreamReader sr = new StreamReader(pipeServer))
    {
        sr.ReadBlock(buffer, 0, buffer.Length);
        unsafe
        {
            fixed (char* ptr = buffer)
            {
                using (Bitmap image = new Bitmap(640, 480, 640*3, PixelFormat.Format24bppRgb, new IntPtr(ptr)))
                {
                    pictureBox1.Image = image;
                    image.Save("test.png");
                }
            }
        }
    }
结果是C#表单上出现一个大的红色X,保存的图像看起来乱七八糟。。。但不仅仅是随机噪音。因此,数据在传输前或在传输结束时在C++端上被弄乱,或者C端被解释。我尝试使用位图构造函数来解决这个问题,它读取流并发送编码图像,而不是原始像素,但这比上述方法更难失败(只给出一个错误,没有输出)


如何将uCHAR*数组从C++中的像素数据转移到C*中,然后在位图中重建它,这样我就可以在窗体上显示它?p> 如果您发送的是实际的二进制数据,那么在这里使用
StreamReader
似乎是错误的选择。
StreamReader
用于读取文本,并将数据解码为具有某种编码的字符,在您的情况下,这种编码将被自动检测(并且肯定是错误的)


您希望使用
BinaryReader
读取二进制数据,或者使用
read()
方法直接从
NamedPipeServerStream
读取
byte[]
数组。C#中的
char
用于存储字符,是unicode,而不是单个字节。

如果使用流,最简单的方法是使用位图的SetPixel方法来构造图像

谢谢,我不知道StreamReader是用来发短信的,不客气。它的名字当然可以更好,但它实际上继承自
TextReader
类,尽管这可能不是人们首先要寻找的东西你需要弄清楚你的数据类型<在C++中,代码>未签名的char <代码>是<代码>字节<代码> >代码> char <代码> > C++中的代码> >代码> >代码>,这将是非常缓慢的。每次SetPixel调用都必须一次锁定和解锁整个位图表面一个像素。