该图像实际上是从本机DLL中抽取的字节数组(作为字节*)。
Img = new Bitmap(g_Width, g_Height, g_Width * 3, PixelFormat.Format24bppRgb, ptr);
注:“图像”在全局范围内。“ptr”是一个IntPtr(本地范围)。
我错过了什么?
我试图保存图像,就像
Img.Save("test.bmp", ImageFormat.Bmp);
此外,我还尝试在创建图像后立即保存图像。文件已成功保存。我也能表演。但我无法从工人那里节省下来。
全局:
BackgroundWorker Worker;
Image img = null;
回调如下:,
private unsafe void GrabFrame(Byte* InputBuff, ref Int32 lBufferLen)
{
Img = new Bitmap(g_Width, g_Height, g_Width * 3,
PixelFormat.Format24bppRgb, (IntPtr)InputBuff);
//Img.Save("test.bmp", ImageFormat.Bmp); // This works fine.
Worker = new BackgroundWorker();
Worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
Worker.RunWorkerAsync();
}
void Worker_DoWork(object sender, DoWorkEventArgs e)
{
try
{
Img.Save("test.bmp", ImageFormat.Bmp); //This is were i get the exception
}
catch (Exception ex)
{
Trace.WriteLine("Exception at Worker_DoWork: " + ex.Message);
}
}
修改代码:
BackgroundWorker Worker;
Image img = null;
Byte[] g_Buffer;
Intptr ptr;
回调如下:,
private unsafe void GrabFrame(Byte* InputBuff, ref Int32 lBufferLen)
{
Img = new Bitmap(g_Width, g_Height, g_Width * 3,
PixelFormat.Format24bppRgb, (IntPtr)InputBuff);
g_Buffer = new byte[lBufferLen];
Marshal.Copy((IntPtr)InputBuff, g_Buffer, 0, lBufferLen);
//Img.Save("test.bmp", ImageFormat.Bmp); // This works fine.
Worker = new BackgroundWorker();
Worker.DoWork += new DoWorkEventHandler(Worker_DoWork);
Worker.RunWorkerAsync();
}
void Worker_DoWork(object sender, DoWorkEventArgs e)
{
try
{
ptr = Marshal.AllocHGlobal(g_Buffer.Length);
Marshal.Copy(g_Buffer, 0, ptr, g_Buffer.Length);
Img = new Bitmap(g_Width, g_Height, g_Width * 3, PixelFormat.Format24bppRgb, ptr);
Img.Save("test.bmp", ImageFormat.Bmp); //still issue persists
// Call unmanaged code
Marshal.FreeHGlobal(ptr);
}
catch (Exception ex)
{
Trace.WriteLine("Exception at Worker_DoWork: " + ex.Message);
}
}
请查找修改后的代码。,
Byte[] Buffer = new Byte[lBufferLen];
Marshal.Copy((IntPtr)InputBuff, Buffer, 0, lBufferLen);
Worker = new BackgroundWorker();
Worker.DoWork += (obj, e) => Worker_DoWork(obj, e, Buffer);
Worker.RunWorkerAsync();
和工人,
void Worker_DoWork(object sender, DoWorkEventArgs e, Byte[] Buffer)
{
try
{
Image Img = null;
IntPtr ptr = Marshal.AllocHGlobal(Buffer.Length);
Marshal.Copy(Buffer, 0, ptr, Buffer.Length);
if (ptr != IntPtr.Zero)
{
Img = new Bitmap(g_Width, g_Height, g_Width * 3, PixelFormat.Format24bppRgb, ptr);
}
Img.Save("test.bmp", ImageFormat.Bmp);
Marshal.FreeHGlobal(ptr);
}
catch (Exception ex)
{
Trace.WriteLine("Exception at Worker_DoWork: " + ex.Message);
}
}