2017-10-01 57 views
-1

我有一些C++/CLI代碼可以創建一個簡單的CImg圖像並在其上繪製一個圓。我想將它傳遞給C#,但我不知道如何。我想使用一個字節數組傳遞給C#,但我無法獲得數組的長度,這是從byte *到byte []的任何轉換或傳遞到非託管內存流所需的。我已經使用strlen的嘗試,但只是返回0如何將CImg圖像對象從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訪問它。在大多數情況下,這不是一個很好的方法,因爲它增加了很多開銷,但它在我的程序中有意義。