2017-10-01 12 views
-1

간단한 CImg 이미지를 생성하고 그 위에 원을 그리는 C++/CLI 코드가 있습니다. C#으로 전달하고 싶지만 어떻게해야할지 모르겠다. 바이트 배열을 사용하여 C#으로 전달하는 방법을 생각했지만 바이트 길이 *에서 바이트 []로 변환하거나 관리되지 않는 메모리 스트림으로 전달하는 데 필요한 배열의 길이를 가져올 수 없습니다. 나는 strlen 함수를 사용하여 시도했지만, 그건 그냥 여기에 0CImg 이미지 객체를 C++/CLI에서 C#으로 전달하는 방법

을 반환 내 C++ 코드 :

unsigned char* calculateFrame::ReadImage() { 
    CImg<unsigned char> testImage(1920, 1080, 1, 3, 0); 
    const unsigned char white[3] = { 255,255,255 }; 
    testImage.draw_circle(256, 256, 200, white, 1.0f, ~0U); 
    testImage.draw_point(500, 500, white, 255); 

    unsigned char* charArray = (unsigned char*)testImage; 
    return charArray; 
} 

C# 코드 :

Bitmap testBmp; 

     using(var test = new FrameCalculator.calculateFrame()) 
     { 
      Console.WriteLine(test.calculateOneFrame(3)); 
      unsafe 
      { 
       byte* imageArray = test.ReadImage(); 
       using(var ms = new UnmanagedMemoryStream(imageArray , /* length of byte* (unknown) */)) 
       { 
        testBmp = new Bitmap(ms); 
       } 
      } 
     } 

당신은 주변에 안전하지 않은 코드를 얻기 위해 어떤 트릭이있는 경우 퍼포먼스를 희생시키지 않으면 좋겠지 만, 안전하지 않은 코드를 사용하는 것에 반대하지는 않습니다.

답변

0

미래에 프레임 버퍼가 필요하다는 결론을 내 렸습니다. 프레임 버퍼를 디스크에 기록해야하므로 다시 시작할 때 손실되지 않았습니다.

어쨌든, 내 솔루션은 이미지를 디스크에 .BMP로 작성하고 C#의 Image.FromFile을 사용하여 액세스하는 것이 었습니다. 이것은 많은 오버 헤드를 추가하기 때문에 대부분의 경우이를 수행하는 좋은 방법은 아니지만 프로그램에서 의미가 있습니다.