调用 GDI+ 时发生一般错误 Image.Save

Generic error occured in GDI+ calling Image.Save

图像实际上是从我的本机 DLL 中抽取的字节数组(作为 Byte *)。

我正在将它转换成如下图像。

Img = new Bitmap(g_Width, g_Height, g_Width * 3, PixelFormat.Format24bppRgb, ptr);

注意:"Image"是在全局范围内。 "ptr" 是一个 IntPtr(本地范围)。

我正在尝试通过 BackgroundWorker 方法保存此图像。当我这样做时,我得到 "A generic error occurred in GDI+" 异常。

我缺少什么?

编辑:

我正在尝试将图像保存为

Img.Save("test.bmp", ImageFormat.Bmp);

此外,我尝试过在创建图像后立即保存图像。文件保存成功。我也可以显示。但是我无法从工人那里存钱。

编辑 2: 全局变量:

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);
    }
}

编辑 4:工作代码

请找到修改后的代码,

在回调中,

 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);
    }
}

谢谢@Vasek。正如评论中所建议的,我必须创建一个本地缓冲区并将其传递给工作人员。

请在已编辑的问题中找到工作代码。