【问题标题】:C# Bitmap and Graphic, memory issues and storing screenshots in memoryC#位图和图形,内存问题和在内存中存储屏幕截图
【发布时间】:2020-02-07 05:24:33
【问题描述】:

首先,给出一个清晰的画面。

在我的课上,我有:

Color FocusArea;
Bitmap FocusImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);

还有一个截图的小功能

private void Screenshot()
{
    Bitmap screenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
    Graphics g = Graphics.FromImage(screenshot);
    g.CopyFromScreen(startscanx, startscany, 0, 0, scanarea, CopyPixelOperation.SourceCopy);
    g.Dispose();
    FocusImage = screenshot;
    //screenshot.Dispose(); // Shit happens when Disposing this one, wtf ?
}

大约一分钟后(每秒 +- 3 到 6 个屏幕截图),内存已累积到大约 4 到 10 GB 并且明显崩溃。

它在崩溃时指出的行是:

Bitmap screenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);

我在将屏幕截图放入FocusImage 后尝试处理它,但是在我的应用程序中使用ForusImage 时它立即崩溃,我想我在这里做了一些可怕的错误,我只是不知道是什么,我希望你能帮我指出我做错了什么?

【问题讨论】:

  • 如果FocusImage 是你类中的一个字段,那么a)你可能不想将它初始化为new Bitmap,并且b)你当然应该Dispose之前分配screenshot给它。
  • 请尝试更准确一点:不要谈论“崩溃”,而是告诉我们确切的错误消息和导致它的行以及错误堆栈!您究竟将所有这些图像存储在哪里?
  • FocusImage.Dispose();焦点图像 = 截图;似乎可以解决问题,遗憾的是我现在不能完全测试它,因为我睡前,但明天我下班回来时会进行压力测试。

标签: c# bitmap gdi


【解决方案1】:

答案来自GSerg的评论。

在将值重新分配给 FocusImage 之前,我必须先处理它,这似乎解决了问题,内存很好并且稳定在一个固定值。

[编辑] 因为有人对我的问题投了反对票,所以我觉得我知道谁和为什么,所以这里是对它的回应:

没有错误消息,它崩溃了,就是这样。 Visual Studio 在这方面的 0 信息,我假设是因为我在那个阶段内存不足。

【讨论】:

    猜你喜欢
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 2017-10-27
    相关资源
    最近更新 更多