代码之家  ›  专栏  ›  技术社区  ›  sam

GDI+调用映像中出现一般错误。保存

  •  -1
  • sam  · 技术社区  · 8 年前

    该图像实际上是从本机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);
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  -1
  •   sam    8 年前

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