使用c#从文件夹动态处理位图文件

时间:2012-02-09 09:01:50

标签: c#

相机将捕获图像并存储在一个文件夹(.bmp文件)中。同时我们的应用程序需要从文件夹中逐个获取图像文件进行处理。(捕获的图像将动态更新文件夹。如果我们使用FileSystemWatcher,它可能会给我们带来问题。(我们在处理图像之前选择目录,因此更新后的图像不会处理。这个问题是否有任何解决方案)如何在运行时从文件夹中逐个获取图像?

4 个答案:

答案 0 :(得分:4)

一种解决方案是使用FileSystemWatcher在将新文件放入文件夹时收到通知。然后,处理文件。

要获取您可以使用的文件夹中所有BMP文件的文件名:

string[] fileNames = Directory.GetFiles("<path>", "*.bmp");

然后你可以正常加载位图。

答案 1 :(得分:1)

答案 2 :(得分:1)

您可以使用FileSystemWatcher,但需要注意一些怪癖。监视器将在首次创建文件时引发 Created 事件,并将一个或多个 Modified 事件作为数据写入文件。没有关闭事件,因此您无法知道相机何时停止写入文件。 只要文件打开以进行写入,您将无法读取它以进行处理,任何尝试读取它都会引发异常

有几种方法可以解决这个问题:

  • 您可以在列表中记录所有事件,并定期处理列表中的所有文件。如果您无法打开文件,只需将其留在列表中即可在下一轮处理中处理。
  • 您可以延迟阅读文件,希望在您尝试读取文件时相机将完成写入。如果仍然收到异常,请稍等片刻,然后重试。
  • 您可以跟踪创建和修改的事件,例如。在由文件名键入的字典中,并且只有在特定超时后没有收到文件的事件时才尝试打开文件。

可以使用计时器实现轮询和超时。

如果您不喜欢轮询引入的延迟,您可以使用单独的线程在事件列表上等待并处理出现的新事件。您可以使用C#4中BlockingCollection的功能以相对简单的方式执行此操作。

答案 3 :(得分:0)

任何图像开发都需要知道如何在C#中加载图像。

<强> FROMFILE

有两种直接方法可以读取图像文件并将其加载到位图或图像中。看看C#代码:

Image myImg = Image.FromFile("path here");
Bitmap myBmp = Bitmap.FromFile("path here");

或者,也可以使用以下内容加载Bitmap对象:

Bitmap myBmp = new Bitmap("path here");

上面的代码不适用于Image对象,因此最好坚持使用FromFile。

对话框

最后,要编写一个从文件加载图像的应用程序,C#程序需要一个对话框来选择文件。使用.Net OpenFileDialog非常简单。只需将图像加载代码应用于用户选择的文件名,例如:

Bitmap loadedBitmap = Bitmap.FromFile(openFileDialog1.Filename);

当然,您不必以这种方式从文件加载图像,但知道它是有用的。

了解更多信息HERE