如何将 CImg 图像对象从 C++/CLI 传递到 C#
How Do I Pass a CImg Image Object from C++/CLI to C#
我有一些 C++/CLI 代码可以创建一个简单的 CImg 图像并在其上绘制一个圆圈。我想将它传递给 C#,但我不确定如何传递。我想过使用字节数组将它传递给 C#,但我无法获得数组的长度,这是从 byte* 到 byte[] 的任何转换或传递到非托管内存流中所需要的。我试过使用 strlen,但那只是 returns 0。
这是我的 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 访问它。在大多数情况下,这不是执行此操作的好方法,因为它会增加很多开销,但它在我的程序中很有意义。
我有一些 C++/CLI 代码可以创建一个简单的 CImg 图像并在其上绘制一个圆圈。我想将它传递给 C#,但我不确定如何传递。我想过使用字节数组将它传递给 C#,但我无法获得数组的长度,这是从 byte* 到 byte[] 的任何转换或传递到非托管内存流中所需要的。我试过使用 strlen,但那只是 returns 0。
这是我的 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 访问它。在大多数情况下,这不是执行此操作的好方法,因为它会增加很多开销,但它在我的程序中很有意义。