从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端,我将数据块读入一个从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); //
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调用都必须一次锁定和解锁整个位图表面一个像素。