如何执行图像流预览到Delphi 6帧或窗体从后台线程有效



我有一个Delphi 6应用程序,它接收和处理来自外部相机的图像流。我有后台线程上的代码,因为它是CPU重,我不希望它与运行在主线程上的用户界面代码干扰。我想用我从相机的JPEG帧中创建的tbitmap更新表单或帧上的矩形区域,这些帧以每秒25帧的速率接收。

我想知道什么方法会给我最好的性能和Windows API调用或Delphi调用使用它。我想我不应该使用TImage或TPicture或类似的VCL组件,因为它们在主线程上运行,我很确定试图通过Synchronize()调用完成任何事情将是低效的,并且有可能减慢所涉及的线程。我还想要一种技术,提供一个平滑的视频显示像双缓冲控制做没有任何"条纹"效果。此外,任何关于适当的Canvas锁定或设备上下文管理等的提示都将受到赞赏,特别是关于避免释放资源时常见错误的提示。

当然,一个链接到一个很好的代码示例,做我需要的将是伟大的。

AFAIK TBitmap是线程安全的,如果你只在它的画布上工作。如果您发送GDI消息并需要刷新屏幕,则需要Synchronize,但从我的实验中,使用TBitmap.Canvas只是围绕线程安全的Windows API的包装器。如果您使用像素算法处理位图(例如使用Scanline),每个线程一个唯一的位图,您可以在后台执行。

但我怀疑使用TBitmap不是最有效的方法。试试http://graphics32.org或http://aggpas.org,这是非常快速的方法来处理位图。

如果可以的话,就像imajoosy建议的那样,处理输入流的最好方法是使用直接的X流处理能力。

对于线程安全的进程,如果每个线程都要消耗其100%的内核(对于图像进程来说很有可能),通常假设您最好为您的处理创建NumberOfCPU-1线程。例如,您可以创建一个线程池,然后让这些线程使用输入流中的位图。

最新更新