C# 使用数字系统C将图像保存到文件夹#

C# 使用数字系统C将图像保存到文件夹#,c#,visual-studio,image-processing,C#,Visual Studio,Image Processing,我的程序有点问题。我正在尝试用C#保存图像,它们会保存,但当我在电脑上拍摄新照片时,它们会覆盖自己。是否有任何方法可以自动将它们命名为与数字不同的名称?例如: 图1.jpg 图像2.jpg 图像3.jpg 我正在使用Visual Studio 2012并用C#编写代码。以下是im使用的一些代码: private void button3_Click(object sender, EventArgs e) { Rectangle form = this.Bou

我的程序有点问题。我正在尝试用C#保存图像,它们会保存,但当我在电脑上拍摄新照片时,它们会覆盖自己。是否有任何方法可以自动将它们命名为与数字不同的名称?例如:

  • 图1.jpg
  • 图像2.jpg
  • 图像3.jpg
我正在使用Visual Studio 2012并用C#编写代码。以下是im使用的一些代码:

  private void button3_Click(object sender, EventArgs e)
  {   


        Rectangle form = this.Bounds;
        using (Bitmap bitmap = new Bitmap(form.Width, form.Height))
        {
            using (Graphics graphic =
                Graphics.FromImage(bitmap))
            {
                graphic.CopyFromScreen(form.Location,
                    Point.Empty, form.Size);
            }


                bitmap.Save("C:/Users/G73/Desktop/My OVMK Photos//OpenVMK.jpg", ImageFormat.Jpeg);


        }
    }

您可以添加类似时间戳的内容:

bitmap.Save("C:/Users/G73/Desktop/My OVMK Photos//OpenVMK" + DateTime.Now.ToString(yyyyMMddHHmmss) + ".jpg", ImageFormat.Jpeg);

一个非常简单的实现可以是:

  • 对文件夹中具有相同名称的文件进行计数
  • 将Count+1附加到要保存的文件名
比如:

var files = Directory.GetFiles(@"C:/Users/G73/Desktop/My OVMK Photos", "OpenVMK*");
...
var newFileName = string.Format(@"C:/Users/G73/Desktop/My OVMK Photos/OpenVMK{0}.jpg", files.Length+1);
bitmap.Save(newFileName, ImageFormat.Jpeg);

试着这样做:

string filename = "file";
string extension = "txt";
string path = System.IO.Path.Combine(filename, extension); //desired path

int i = 1;

while(System.IO.File.Exists(path));
{
    //assemble fallback path
    path = System.IO.Path.Combine(string.Format("{0} ({1})", filename, i++), extension);

    if(int == Int32.MaxValue && System.IO.File.Exists(path))
        throw new InvalidOperationException("Too many files and commenters are pedants");
}

//save your file

如果您的文件名始终遵循如下模式

“图像”+数字+.jpg

您可以编写代码以获取最大数量,然后创建一个文件名,并使用递增的

string file1 = "image1.jpg";
string file2 = "image13.jpg";
string number = file1.Substring(5, file1.IndexOf(".") - 5);
number = file2.Substring(5, file2.IndexOf(".") - 5);
但是,这取决于您有多少文件。这可能会影响性能。 其他选择可以是:

编写一个仅包含数字(最大数字)的文件 每当你想写一个新的图像文件

  • 读那个号码
  • 增加它
  • 以递增的数字保存图像文件
  • 然后用递增的数字重写该文件
您只需检查现有文件,然后在建议的文件名中添加1、2、3等:

    private static int GetNextFileNumber(String fileFullName) {
      int result = -1;

      String fileName = Path.GetFileNameWithoutExtension(fileFullName);
      String ext = Path.GetExtension(fileFullName);

      foreach (String file in Directory.GetFiles(Path.GetDirectoryName(fileFullName))) {
        if (!String.Equals(ext, Path.GetExtension(file), StringComparison.OrdinalIgnoreCase))
          continue;

        String name = Path.GetFileNameWithoutExtension(file);

        if (!name.StartsWith(fileName, StringComparison.OrdinalIgnoreCase))
          continue;

        if (result < 0)
          if (name.Equals(fileName, StringComparison.OrdinalIgnoreCase))
            result = 1;

        int num = 0;

        if (int.TryParse(name.Substring(fileName.Length), out num))
          if (num > result)
            result = num + 1;
      }

      return result;
    }

    private static String GetNextFileName(String fileFullName) {
      int number = GetNextFileNumber(fileFullName);

      if (number <= 0)
        return fileFullName;

      return Path.Combine(Path.GetDirectoryName(fileFullName), 
                          Path.GetFileNameWithoutExtension(fileFullName) + (number).ToString() + Path.GetExtension(fileFullName));
    }


   ....

   private void button3_Click(object sender, EventArgs e)
   { 
      ....
      // bitmap.Save("C:/Users/G73/Desktop/My OVMK Photos/OpenVMK.jpg", ImageFormat.Jpeg);

      // Instead of file_name use GetNextFileName(file_name):
      bitmap.Save(GetNextFileName("C:/Users/G73/Desktop/My OVMK Photos/OpenVMK.jpg"), ImageFormat.Jpeg);
      ....
   }
private static int GetNextFileNumber(字符串fileFullName){
int结果=-1;
String fileName=Path.GetFileNameWithoutExtension(fileFullName);
字符串ext=Path.GetExtension(fileFullName);
foreach(Directory.GetFiles(Path.GetDirectoryName(fileFullName))中的字符串文件){
如果(!String.Equals(ext,Path.GetExtension(文件),StringComparison.OrdinalIgnoreCase))
持续
String name=Path.GetFileNameWithoutExtension(文件);
如果(!name.StartsWith(文件名,StringComparison.OrdinalIgnoreCase))
持续
如果(结果<0)
if(name.Equals(fileName,StringComparison.OrdinalIgnoreCase))
结果=1;
int num=0;
if(int.TryParse(name.Substring(fileName.Length),out num))
如果(数值>结果)
结果=num+1;
}
返回结果;
}
私有静态字符串GetNextFileName(字符串fileFullName){
int number=GetNextFileNumber(fileFullName);

如果(数字)我正在使用VisualBasics2012并用C#编码。哇,伙计,注意f*ck。如果可读性不重要,请使用GUID:这将计算名为“OpenVMKSomethinglese.jpg”的文件这不算什么。儿子,如果你有int.MaxValue文件,且文件名以相同的模式递增,你会遇到更大的问题。我在循环中断时进行了编辑,但无论如何,这仍然是个例外。我不明白。这被标记为答案,但不能解决问题的要求。错误的工程警报。#redf滞后我在路上,元,这是一个伟大的案例,除了OP选择的答案,社区打破了一个解决方案,打破了上述要求和正确答案解决的问题是,如果你保存两个文件在同一秒发生什么?@ Gusdor如果这是你的问题,然后使用HHMMSSSFFFF格式。nage以千分之一秒的速度保存它,然后确定。我的解决方案给出了一种方法,但您仍然可以根据需要修改它。正如我看到的,因为他正在将它保存到用户特定的文件夹中,并且它正在使用一个按钮事件,这意味着人工干预以及他一次保存一个图像的事实,这与更快地保存非常不同我的问题是它被标记为答案,但在“第二个”错误之前,它是明显错误的。考虑维护场景。代码更改可以很容易地引入不可见的问题。我想你可以线程。睡眠以字符串格式指定的最低增量,但不是你有2件事。如果字符串格式发生变化(格式和睡眠)。由增量或visa verse驱动的格式比使用原始示例格式的解决方案更具代码性。用“meh,It sare”来传递失败状态是一种糟糕的态度——我对自己的答案的评论感到内疚。我们应该努力纠正这种心态。
    private static int GetNextFileNumber(String fileFullName) {
      int result = -1;

      String fileName = Path.GetFileNameWithoutExtension(fileFullName);
      String ext = Path.GetExtension(fileFullName);

      foreach (String file in Directory.GetFiles(Path.GetDirectoryName(fileFullName))) {
        if (!String.Equals(ext, Path.GetExtension(file), StringComparison.OrdinalIgnoreCase))
          continue;

        String name = Path.GetFileNameWithoutExtension(file);

        if (!name.StartsWith(fileName, StringComparison.OrdinalIgnoreCase))
          continue;

        if (result < 0)
          if (name.Equals(fileName, StringComparison.OrdinalIgnoreCase))
            result = 1;

        int num = 0;

        if (int.TryParse(name.Substring(fileName.Length), out num))
          if (num > result)
            result = num + 1;
      }

      return result;
    }

    private static String GetNextFileName(String fileFullName) {
      int number = GetNextFileNumber(fileFullName);

      if (number <= 0)
        return fileFullName;

      return Path.Combine(Path.GetDirectoryName(fileFullName), 
                          Path.GetFileNameWithoutExtension(fileFullName) + (number).ToString() + Path.GetExtension(fileFullName));
    }


   ....

   private void button3_Click(object sender, EventArgs e)
   { 
      ....
      // bitmap.Save("C:/Users/G73/Desktop/My OVMK Photos/OpenVMK.jpg", ImageFormat.Jpeg);

      // Instead of file_name use GetNextFileName(file_name):
      bitmap.Save(GetNextFileName("C:/Users/G73/Desktop/My OVMK Photos/OpenVMK.jpg"), ImageFormat.Jpeg);
      ....
   }