C# 如何在C中使用不同的文件名保存从网络摄像头捕获的图像#

C# 如何在C中使用不同的文件名保存从网络摄像头捕获的图像#,c#,C#,如何使用不同的文件名将从网络摄像头捕获的图像保存到我的c://驱动器 我已经能够捕获图像网络摄像头并将其保存在我的c:/drive上,但我遇到了一些小问题。我希望每次保存图像时,它不应覆盖已保存在我的c:/ (即保存的图像将不同于以前未触及的图像,具有不同的名称pix1.jpg,pix2.jpg,pixs3.jpg,pix4.jpg等)。在捕获并保存到特定文件名的方法中,请使用: string fileName; int n = 0; do { fileName = "pix" + (

如何使用不同的文件名将从网络摄像头捕获的图像保存到我的
c://
驱动器

我已经能够捕获图像网络摄像头并将其保存在我的c:/drive上,但我遇到了一些小问题。我希望每次保存图像时,它不应覆盖已保存在我的c:/


(即保存的图像将不同于以前未触及的图像,具有不同的名称
pix1.jpg
pix2.jpg
pixs3.jpg
pix4.jpg
等)。

在捕获并保存到特定文件名的方法中,请使用:

string fileName;
int n = 0;

do {
    fileName = "pix" + (++n).ToString() + ".jpg";
} while(System.IO.File.Exists(fileName));

然后将
fileName
添加到路径中,就完成了。

在捕获并保存到特定文件名的方法中,使用:

string fileName;
int n = 0;

do {
    fileName = "pix" + (++n).ToString() + ".jpg";
} while(System.IO.File.Exists(fileName));

然后将
fileName
添加到路径中,就完成了。

如果无法跟踪当前编号的输出图片,可以查看当前存在的文件并确定最大数量,然后添加具有下一个编号的文件

int max = 0;
var files = Directory.EnumerateFiles(@"C:\pictures", "pix*.jpg");
if(files.Any())
  max = files.Select(x => Convert.ToInt32(Path.GetFileNameWithoutExtension(x.Name)
                                              .Substring("pix".Length)))
             .Max();
string fileName = Path.Combine(@"C:\pictures", string.Format("pix{0}.jpg", max + 1));

如果无法跟踪当前编号的输出图片,则可以查看当前存在的文件并确定最大编号,然后添加具有下一个编号的文件

int max = 0;
var files = Directory.EnumerateFiles(@"C:\pictures", "pix*.jpg");
if(files.Any())
  max = files.Select(x => Convert.ToInt32(Path.GetFileNameWithoutExtension(x.Name)
                                              .Substring("pix".Length)))
             .Max();
string fileName = Path.Combine(@"C:\pictures", string.Format("pix{0}.jpg", max + 1));

就我个人而言,我会在文件名中附加一个可排序格式的
DateTime
,而不是使用数字

string name = "pix";
string fileName = string.Format("{0}_{1}", name, DateTime.Now.ToString("u"));
这将为您提供如下文件名:
pix_201110310834
pix_201110310835
pix_201110310836
,等等

使用这种方法,您不再需要担心只使用正确的索引;DateTime将始终向前推进

注:

  • 如果您需要更短的时间间隔(可能是毫秒),您可以 始终只需追加
    DateTime.Now.Ticks即可
  • 如果您担心跨时区移动或切换DST,请使用中性时区。(
    DateTime.UtcNow
    是你的朋友)

就我个人而言,我会在文件名中附加一个可排序格式的
DateTime
,而不是使用数字

string name = "pix";
string fileName = string.Format("{0}_{1}", name, DateTime.Now.ToString("u"));
这将为您提供如下文件名:
pix_201110310834
pix_201110310835
pix_201110310836
,等等

使用这种方法,您不再需要担心只使用正确的索引;DateTime将始终向前推进

注:

  • 如果您需要更短的时间间隔(可能是毫秒),您可以 始终只需追加
    DateTime.Now.Ticks即可
  • 如果您担心跨时区移动或切换DST,请使用中性时区。(
    DateTime.UtcNow
    是你的朋友)

您还可以为每个图像生成一个唯一的GUID您还可以为每个图像生成一个唯一的GUID如果您这样做,我会确保您每次都能避免循环/文件名检查。例如,我会存储
n
并每次重复使用它。可能让它重置每个程序启动,但不要让它在每次调用此方法时重置。“//将图像另存为jpeg格式。//image.Save(“c:\\traffic\u light\\image.jpeg”,System.Drawing.Imaging.ImageFormat.jpg);”@DaveChika:将
文件名
与您的路径(减去文件名)连接起来。@minitecht,谢谢。我能够从笔记本电脑网络摄像头捕获图像,但它将pix/图像保存在bin的调试文件夹中。但是,当我添加一个外部网络摄像头时,它不会出现问题,但会说“在捕获视频图像时出现错误。视频图像现在将被终止,对象引用未设置为对象的实例”。@DaveChika:这需要一个新问题,因为它与此无关。如果你这样做,我会确保您每次都做一些避免循环/文件名检查的事情。例如,我会存储
n
并每次重复使用它。可能让它重置每个程序启动,但不要让它在每次调用此方法时重置。“//将图像另存为jpeg格式。//image.Save(“c:\\traffic\u light\\image.jpeg”,System.Drawing.Imaging.ImageFormat.jpg);”@DaveChika:将
文件名
与您的路径(减去文件名)连接起来。@minitecht,谢谢。我能够从笔记本电脑网络摄像头捕获图像,但它将pix/图像保存在bin的调试文件夹中。但是,当我添加一个外部网络摄像头时,它不会出现问题,但会说“在捕获视频图像时出现错误。视频图像现在将被终止,对象引用未设置为对象的实例”。@DaveChika:这需要一个新问题,因为它与此无关。BROKENglass,这是我保存图像的方法,请告诉我如何在我的方法中使用你的代码。我是C#public static void SAVEimage(System.Drawing.Image)的初学者{//将图像另存为jpeg.Image.Save(“C:\\image1.gif”,System.Drawing.Imaging.ImageFormat.jpeg);}BROKENglass,这是我保存图像的方法,请告诉我如何在我的方法中使用你的代码。我是C#public static void SAVEimage(System.Drawing.Image)的初学者{//将图像另存为jpeg.Image.Save(“C:\\image1.gif”,System.Drawing.Imaging.ImageFormat.jpeg);}