-1

我的程序遇到了一些问题。我正在尝试将图像保存在 C# 中,它们会保存,但是当我在计算机上拍摄新照片时它们会覆盖自己。反正有没有像数字一样自动命名它们?例如:

  • 图片1.jpg
  • 图片2.jpg
  • 图片3.jpg

我正在使用 Visual Studio 2012 和 C# 中的编码。这是我使用的一些代码:

  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);


        }
    }
4

6 回答 6

3

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

bitmap.Save("C:/Users/G73/Desktop/My OVMK Photos//OpenVMK" + DateTime.Now.ToString(yyyyMMddHHmmss) + ".jpg", ImageFormat.Jpeg);
于 2013-08-29T07:21:11.407 回答
1

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

  • 统计文件夹中的同名文件
  • 将 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);
于 2013-08-29T07:23:15.313 回答
0

尝试这样的事情:

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
于 2013-08-29T07:29:32.327 回答
0
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);
        }

        int count = 1;

        string baseFileName = "OpenVMK";
        string ext = ".jpg";
        string pathToFile = "C:/Users/G73/Desktop/My OVMK Photos";            
        while(System.IO.File.Exists(System.IO.Path.Combine(pathToFile, string.Format("{0}{1}{2}", baseFileName, i++, ext))) {};

        bitmap.Save(System.IO.Path.Combine(pathToFile, string.Format("{0}{1}{2}", baseFileName, i++, ext)), ImageFormat.Jpeg);


    }
}
于 2013-08-29T07:30:25.447 回答
0

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

“图像” + 数字 + .jpg

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

string file1 = "image1.jpg";
string file2 = "image13.jpg";
string number = file1.Substring(5, file1.IndexOf(".") - 5);
number = file2.Substring(5, file2.IndexOf(".") - 5);

但是,这取决于您拥有多少文件。这会影响性能。其他选项可能是:

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

  • 读那个号码
  • 增加它,
  • 用递增的数字保存图像文件
  • 并用递增的数字重写该文件
于 2013-08-29T07:38:50.710 回答
0

您可以只检查现有文件并将 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);
      ....
   }
于 2013-08-29T07:46:06.127 回答