C# 在windows和mono linux平台上显示RGB图像

C# 在windows和mono linux平台上显示RGB图像,c#,linux,windows,winforms,mono,C#,Linux,Windows,Winforms,Mono,我想使用mono命令在Linux PC上运行一个.NET应用程序 mono application.exe 我取得了一些小小的成功,并收到了与在windows上运行相同的GUI。所以我很高兴在我的Linux平台上看到GUI byte[] data_rgb; data_rgb = new Byte[HEIGHT * WIDTH * 3]; public const int HEIGHT = 1944; public const int WIDTH = 2592; fixed (byte* b

我想使用mono命令在Linux PC上运行一个.NET应用程序

mono application.exe 
我取得了一些小小的成功,并收到了与在windows上运行相同的GUI。所以我很高兴在我的Linux平台上看到GUI

byte[] data_rgb;
data_rgb = new Byte[HEIGHT * WIDTH * 3];
public const int HEIGHT = 1944;
public const int WIDTH = 2592;

fixed (byte* bPtr = data_rgb)
{
    IntPtr pSrc = (IntPtr)bPtr;
    bmp = new Bitmap(WIDTH, HEIGHT, STRIDE, PixelFormat.Format24bppRgb, pSrc);
}
然后,我想在窗口中显示一个图像,在windows平台上完美地显示

byte[] data_rgb;
data_rgb = new Byte[HEIGHT * WIDTH * 3];
public const int HEIGHT = 1944;
public const int WIDTH = 2592;

fixed (byte* bPtr = data_rgb)
{
    IntPtr pSrc = (IntPtr)bPtr;
    bmp = new Bitmap(WIDTH, HEIGHT, STRIDE, PixelFormat.Format24bppRgb, pSrc);
}
但是,当我尝试在Linux平台上使用mono命令运行同一个.net应用程序时,我无法成功显示windows平台上显示的图像

byte[] data_rgb;
data_rgb = new Byte[HEIGHT * WIDTH * 3];
public const int HEIGHT = 1944;
public const int WIDTH = 2592;

fixed (byte* bPtr = data_rgb)
{
    IntPtr pSrc = (IntPtr)bPtr;
    bmp = new Bitmap(WIDTH, HEIGHT, STRIDE, PixelFormat.Format24bppRgb, pSrc);
}
请参阅以下代码参考以在windows平台中显示图像

byte[] data_rgb;
data_rgb = new Byte[HEIGHT * WIDTH * 3];
public const int HEIGHT = 1944;
public const int WIDTH = 2592;

fixed (byte* bPtr = data_rgb)
{
    IntPtr pSrc = (IntPtr)bPtr;
    bmp = new Bitmap(WIDTH, HEIGHT, STRIDE, PixelFormat.Format24bppRgb, pSrc);
}
数据_rgb是来自硬件的数据缓冲区,约为6 MB rgb数据

有人知道为什么上面的功能在使用mono实用程序的Linux平台上不起作用吗

另外,请让我知道是否有任何其他方法可以使用windows中的其他库显示图像,Linux平台支持使用mono frame显示图像

还有一个问题是,如何刷新由mono命令运行的windonw?因为每当我使用mono实用程序运行.NET二进制文件,然后最小化或最大化窗口时,与windows相比,它就不能正确地最小化或最大化


如何在linux中使用mono刷新窗口?

问题不在于mono和位图类

问题是你的图像数据来自哪里:你提到它来自USB设备。但是如何从.NET代码访问设备?看起来你在使用IntPtr,这让我觉得你在使用

p/Invoke本质上是一种不跨平台的技术。如果您希望程序能够跨平台(Linux和Windows)工作,而无需特定的平台代码,则应坚持使用托管代码


更新:您提到您有一个“.so”库来访问Linux上特定于平台的功能。那么这可能是不起作用的位。您应该在stackoverflow上发布一个全新的问题,其中包含在Linux中P/调用该库所用的代码。

提供有关PSRCher的更多详细信息您需要关于PSRCher的以下数据您需要关于pSrc的以下数据。字节[]数据_rgb;data_rgb=新字节[高度*宽度*3];固定(byte*bPtr=data_rgb){IntPtr pSrc=(IntPtr)bPtr;bmp=new Bitmap(宽度、高度、步幅、PixelFormat.Format24bppRgb、pSrc);}这里的数据_rgb是总缓冲区,大约是2MB数据从原始数据转换成rgb 24位数据。{IntPtr pSrc=(IntPtr)bPtr;bmp=new Bitmap(宽度、高度、步幅、PixelFormat.Format24bppRgb、pSrc);}所以,基本上,pSrc是指向rgb缓冲区数据的指针,其中包含来自驱动程序的rgb数据。感谢您的回复。但我可以使用我导入的.so文件代替.dll文件从设备获取USB数据。我从设备获得了正确的数据到rgb缓冲区。因此,那里没有任何硬件依赖性。然后,也许您在您的应用程序中发现了mono错误特定场景:可能只有在使用PixelFormat.Format24bppRgb enum时才会出现此错误?您应该进行一些测试。然后在中提交一个错误。您是否更了解如何从Linux端调试此问题?是的,找到一个有效的案例,然后查看代码()找出为什么在你的情况下它没有t@RiteshPrajapati,您必须调试到libgdiplus和系统中。在Linux上绘图,以便更好地了解它是如何工作的,以及为什么失败。我在该领域遇到了其他错误,我完全被找到原因的负担打败了。如果可能的话,切换到GTK#。Mono上的WinForms远非如此生产质量,并且您几乎在每一个场地都遇到问题(特别是当您使用指针和非托管物品时)。