如何将CImg图像对象从C++/CLI传递到C#

如何将CImg图像对象从C++/CLI传递到C#

问题描述:

我有一些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); 
       } 
      } 
     } 

如果您有任何技巧来解决不安全的代码而不牺牲性能,这将是很好的,但我不反对在必要时使用不安全的代码。

我最终决定在将来我需要一个帧缓冲区,它需要将帧写入磁盘,以便它们在重新启动时不会丢失。

无论如何,我的解决方案是将图像作为.BMP写入磁盘,并使用C#中的Image.FromFile访问它。在大多数情况下,这不是一个很好的方法,因为它增加了很多开销,但它在我的程序中有意义。