【问题标题】:Generic error in GDI+GDI+ 中的一般错误
【发布时间】:2015-05-21 20:18:03
【问题描述】:

我正在循环保存来自相机的图像,但有时它在某些系统中的 gdi+ 中出现一般错误,而我使用 i7 4gb ram 并且当我使用 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);
}

请有人给我解决方案,这对我来说非常重要

【问题讨论】:

  • 是在保存期间还是在其他时间出现 GDI+ 错误?你真的需要在每个循环中创建一个新的位图,或者你可以通过在循环之前定义它来重用位图吗?您是否在循环结束时处理您的图像?听说过i.ToString().PadLeft('0', 3) 将 00 添加到索引器中,为什么以及循环中的延迟有多长。您似乎在使用哪个相机库?
  • 它是一个私人相机库,延迟约为 500,保存 bmp 时出现错误
  • 您可以先将代码放入using 块中,例如using(Bitmap bm = new Bitmap(1024,1280)) { ... }。也许这可以解决您的问题,即使它不是处理IDisposable 资源的正确方法。
  • 是否可以至少显示在 Camera.Memory.CopyToBitmap 中 out Bitmap 变量是如何使用/创建/填充的?
  • @AlessandroD'Andria 我同意你的观点,并且也在这行上写了一个答案,但在这种情况下,out 参数让我有点困扰?

标签: c# gdi+ bmp


【解决方案1】:

我想通过一些重构可以使内存更加友好,例如:

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 参数,因为位图无论如何都会通过 Reference 传递)

【讨论】:

  • 小心out - 很可能它是一个写得很糟糕的 P/Invoke,而正确的修饰符应该是 ref - out 不是 IL 的一个特性,只是 C#(它在 IL 中被翻译成ref)。也就是说,传递一个实际的 Bitmap 对象已经很可疑了......但是,是的,绝对比 OP 的版本更好、更安全。
猜你喜欢
  • 2011-03-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
相关资源
最近更新 更多