2011-10-15 3 views
3

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 생성자를 사용하여이 문제를 해결하려고 시도했지만 위의 메서드 (단순히 오류, 출력 없음)보다 더 어려워졌습니다.

what it looks like

어떻게 I 양식에 표시 할 수 있도록 * 다음 화소 C 번호에 ++ C의 데이터와 함께 배열 비트 맵 내부를 재구성 UCHAR 전송 하는가?

+0

데이터 유형을 알아야합니다. C++의'unsigned char'는 C#에서'byte'입니다; C#의'char'는 C++의'wchar_t'입니다. – ildjarn

답변

6

여기에서 StreamReader의 사용은 실제로 보내는 것이 2 진 데이터 인 경우 잘못된 선택으로 보입니다. StreamReader은 텍스트를 읽는 데 사용되며, 데이터를 문자로 디코딩하여 귀하의 경우 자동으로 감지되는 인코딩을 사용합니다 (물론 틀린 경우도 있음).

당신은 바이너리 데이터를 읽기 위해 BinaryReader를 사용하거나 byte[] 배열을 얻을 수있는 Read() 방법을 사용하여 NamedPipeServerStream에서 직접 읽고 싶어. C#의 char은 문자를 저장하는 데 사용되며 단일 바이트가 아니라 유니 코드입니다.

+0

감사합니다. StreamReader가 텍스트 용인지 알지 못했습니다. -__- – Jim

+0

그것의 이름은 확실히 좋았을 수도 있지만 실제로 TextReader 클래스를 상속 받았다. ;) – DeCaf

0

스트림을 사용하는 경우 가장 쉬운 방법은 비트 맵의 ​​SetPixel 메서드를 사용하여 이미지를 구성하는 것입니다.

+1

그것은 끔찍하게 느릴 것입니다. 각 SetPixel 호출은 한 번에 한 픽셀 씩 전체 비트 맵 표면을 잠 그거나 잠금을 해제해야합니다. – asawyer

관련 문제