C# 프로젝트와 C# 프로젝트를 연결하고 명명 된 파이프를 통해 이미지를 보내야합니다. OpenCV는 행렬 데이터를 연속 청크에 저장하며 uchar* Mat::data
부터 시작합니다. 그러나 명명 된 파이프를 통해 데이터를 보내려면 char*
이어야하므로 캐스트를 수행하고 내가 수행해야 할 다른 작업이 무엇인지 확실하지 않습니다. 중요하지 않아야합니다. 단지 문자 일뿐 데이터가 아닙니다.C#에서 char [] 버퍼에서 비트 맵 만들기
size_t s = frame2.elemSize() * frame2.rows * frame2.cols;
sendChars(hPipe, (char*)frame2.data, s);
C# 측에서는 데이터 블록을 char[]
버퍼로 읽습니다. 그런 다음 적절한 너비, 높이 등으로 새 Bitmap
을 만들고 char[] buffer
의 시작 부분에 IntPtr을 설정합니다.
//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# 끝에서 엉망이되어 가고 있습니다. 스트림을 읽고 원시 픽셀 대신 인코딩 된 이미지를 보내는 Bitmap 생성자를 사용하여이 문제를 해결하려고 시도했지만 위의 메서드 (단순히 오류, 출력 없음)보다 더 어려워졌습니다.
어떻게 I 양식에 표시 할 수 있도록 * 다음 화소 C 번호에 ++ C의 데이터와 함께 배열 비트 맵 내부를 재구성 UCHAR 전송 하는가?
데이터 유형을 알아야합니다. C++의'unsigned char'는 C#에서'byte'입니다; C#의'char'는 C++의'wchar_t'입니다. – ildjarn