Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GDI中的一般错误+_C#_Gdi+_Bmp - Fatal编程技术网

C# GDI中的一般错误+

C# GDI中的一般错误+,c#,gdi+,bmp,C#,Gdi+,Bmp,我将相机的图像保存在一个循环中,但在某些系统中,当我使用i7 4gb ram时,它会在gdi+中出现一般性错误,而当我使用i3 4gnb ram系统时,它不会出现 for (int i = 1; i <= frameno; i++) { Bitmap bm = new Bitmap(1024,1280); Int32 s32MemID; Camera.Memory.GetActive(out s32MemID); Camera.Memory.CopyToBi

我将相机的图像保存在一个循环中,但在某些系统中,当我使用i7 4gb ram时,它会在gdi+中出现一般性错误,而当我使用i3 4gnb ram系统时,它不会出现

for (int i = 1; i <= frameno; i++)
{
    Bitmap bm = new Bitmap(1024,1280);
    Int32 s32MemID;
    Camera.Memory.GetActive(out s32MemID);
    Camera.Memory.CopyToBitmap(s32MemID, out bm);
    bm.RotateFlip(RotateFlipType.Rotate90FlipNone);
    String str = "";
    if (i < 10)
    {
        str = "00";
    }
    else if (i < 100)
    {
        str = "0";
    }
    bm.Save(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + "\\capture" + str + i + ".bmp", ImageFormat.Bmp); 
    Thread.Sleep(delay);
}

请有人给我一个解决方案它对我来说非常重要

我想通过一些重构,它可以通过使用,例如:

Int32 s32MemID;
Bitmap bm;
string targetPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
for (int i = 1; i <= frameno; i++)
{
    try
    {
        Camera.Memory.GetActive(out s32MemID);
        Camera.Memory.CopyToBitmap(s32MemID, out bm);
        bm.RotateFlip(RotateFlipType.Rotate90FlipNone);
        bm.Save(Path.Combine(targetPath, "capture" + (i.ToString().PadLeft('0', 3)) + ".bmp"), ImageFormat.Bmp); 
    }
    finally 
    {
        if (bm != null) 
        {
            bm.Dispose();
            bm = null;
        }
    }
    Thread.Sleep(delay);
}

通常我会建议使用模式,但由于您没有显示Camera.Memory.CopyToBitmap方法如何处理out-Bitmap参数,因此很难说应该如何处理,如果它是您自己的库,我不明白您为什么需要out参数,由于位图无论如何都会通过引用传递

是在保存过程中还是在另一个时间出现GDI+错误?您真的需要在每个循环中创建一个新的位图,还是可以通过在循环之前定义位图来重用位图?是否在循环结束时处理图像?听说过i.ToString.PadLeft'0',3将00添加到索引器中吗,为什么以及循环中的延迟有多长。您似乎正在使用哪个摄像头库?它是一个专用摄像头库,延迟约为500,在保存bmp时会出现错误。您可以通过使用位图bm=new bitmap10241280{…}将代码放入一个using块中开始,如下图所示。也许这可以解决你的问题,即使不是,这也是处理IDisposable资源的正确方法。是否可以至少显示在Camera.Memory.CopyToBitmap中out Bitmap变量是如何使用/创建/填充的?@AlessandroD'Andria我同意你的观点,并在这一行上写了一个答案,但在这种情况下out参数有点让我作呕?小心out-很可能是一个写得很糟糕的P/Invoke,正确的修饰符应该是ref-out不是IL的一个特性,只是C的特性,它在IL中被转换为ref。这就是说,它已经相当可疑,一个实际的位图对象被传递。。。但是是的,绝对比OP的版本更好更安全。