Не удается сохранить изображение в папке, которую я создал - PullRequest
0 голосов
/ 14 октября 2018

В настоящее время я создаю программу для изменения размера изображения на C # Windows Forms.Итак, я заставляю его перезаписывать существующие изображения измененными изображениями.Я также создал функцию, которая создает папку Originals и сохраняет в ней изображения оригиналов, чтобы при необходимости использовать изображения в папке.Ниже th

for (int k = 0; k < openFileDialog.FileNames.Length; k++)
{
   fileNames.Add(openFileDialog.FileNames[k]);

   using (Stream stream = File.OpenRead(fileNames[k]))
   {
       //System.Collections.Generic.List<System.Drawing.Image>
       selectedImages.Add(Image.FromStream(stream));
       resizedImages.Add(Image.FromStream(stream));                                                 
   }
   filesCount++;
}

for (int k = 0; k < filesCount; k++)
{
    string filePath = Path.GetDirectoryName(fileNames[k]);
    Directory.CreateDirectory(filePath + "\\Originals");

    string selectedFileName = filePath + "\\Originals\\" + Path.GetFileName(fileNames[k]);
    string resizedFileName = filePath + "\\" + Path.GetFileNameWithoutExtension(fileNames[k]) + ".jpg";

    //GetImageFormat is my function that return ImageFormat. It has no problem.
    selectedImages[k].Save(selectedFileName, GetImageFormat(Path.GetExtension(fileNames[k])));
    resizedImages[k].Save(resizedFileName, ImageFormat.Jpeg);
}

Проблема здесь в том, что selectedImages[k].Save генерирует общую ошибку GDI +, хотя resizedImages[k].Save работает совершенно нормально.Я думаю, что это из-за папки, которую я создал, но я не могу найти решение.

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Проблема в том, что вы пытаетесь перезаписать существующий файл.Это не поддерживается методом Image.Save.

Решение простое, удалите файл перед повторным сохранением:

File.Delete(selectedFileName);
selectedImages[k].Save(selectedFileName, GetImageFormat(Path.GetExtension(fileNames[k])));
0 голосов
/ 14 октября 2018

Я думаю, что это из-за папки, которую я создал, но я не могу найти решение.

Неправильно Directory.CreateDirectory вызовет исключение, если ононе могу создать его, когда он еще не существует.


Так что давайте решать проблемы, которые у вас есть

  • \\Originals\\ не делайте этого, если вам нужен обратный слешиспользуйте @ \Originals\
  • Если вы собираетесь объединить путь, используйте Path.Combine
  • Не используйте for, когда вы можете использовать foreach
  • не было необходимости создавать так много списков и циклов
  • если вы создаете изображение, вам нужно располагать его
  • И самый большой из них, doне попытайтесь сохранить файл поверх файла с дескриптором открытого файла.

В такие моменты вам нужно отступить от своего кода и удалить всю избыточность.Большая часть вашего кода была абсолютно не нужна, и это делает вашу жизнь более трудной для отладки

foreach (var file in openFileDialog.FileNames)
{
   var name = Path.GetFileName(file);
   var path = Path.GetDirectoryName(file);
   var newPath = Path.Combine(path, "Originals");
   var newName = $"{Path.GetFileNameWithoutExtension(name)}.jpg";

   Directory.CreateDirectory(newPath);

   var newFullPath = Path.Combine(newPath, name);
   // why do anything fancy when you just want to move it
   File.Move(file, newFullPath);

   // lets open that file from there, so we don't accidentally cause the same 
   // problem again, then save it
   using (var image = Image.FromFile(newFullPath))
      image.Save(Path.Combine(path, newName), ImageFormat.Jpeg);  
}

Хотя я не уверен, в чем заключалась ваша настоящая проблема, я предполагаю, что это был метод GetImageFormat, или выпытались перезаписать файл с открытой ручкой.Однако, в духе того, что я думаю, вы пытаетесь достичь, это, вероятно, просто сработает

...