【问题标题】:How to use Bitmap for live and processing at a time?如何一次使用 Bitmap 进行实时和处理?
【发布时间】:2014-08-07 19:52:52
【问题描述】:

我使用 imageAvailable 事件从相机获取位图(每 1 秒 25 个)。我必须在 GUI 上显示它并处理该位图。所以我使用了两个位图,一个用于实时,另一个用于处理。 问题是我在处理“currentFrame2”时收到了 invalidOperationException(它说“对象目前正在其他地方使用”)。直播我用的是“currentFrame”,也没问题。

currentFrame = (Bitmap)e.ImageBuffer.Bitmap.Clone();
currentFrame2 = currentFrame;

我在看

  1. Bitmap.Save "Object is currently in use elsewhere" Threading Issue
  2. Accessing an object on 2 threads at the same time

以上链接无济于事。

请给我一个解决这个问题的建议。

谢谢

【问题讨论】:

    标签: c# concurrency bitmap invalidoperationexception


    【解决方案1】:

    试试:

    currentFrame = (Bitmap)e.ImageBuffer.Bitmap.Clone();
    currentFrame2 = (Bitmap)e.ImageBuffer.Bitmap.Clone();
    

    问题是currentFramecurrentFrame2 引用的是同一个对象。通过为第二个对象引用使用副本,您应该不会再遇到异常了。

    【讨论】:

    • 感谢您的回复。它没有用。还是一样的例外。
    • 那么我猜问题出在其他地方。请您分享更多代码吗?
    • 嗯,我有四个类Camera(是主类),IpCam,ImageProcessing,和Streaming。我在 IpCam 类中获得了上述位图,这里我有两个属性(CurrentFrame、CurrentFrame2)将这些位图返回给其他类。在主类中,我为 IpCam 类创建了一个静态对象。我在其他类中使用这个对象来获取位图。 Camera.ipCam.CurrentFrame 用于 Streaming 类,Camera.ipCam.CurrentFrame2 用于 ImageProcessing 类。
    • 检查您的属性:它们是否真的返回不同的引用或者可能有错字?其次,尝试在属性中克隆您的图像缓冲区,而不是在您收到它的事件中,而是在您的属性中。这样您就可以保证 IpCam 之外的任何人都无法访问同一个对象实例。
    • 感谢您的评论。我尝试了上述步骤,imageProcessing 工作正常,但另一个(实时)正在抛出 invalidOperationException。
    猜你喜欢
    • 2015-09-11
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 2011-10-01
    • 2015-06-30
    相关资源
    最近更新 更多