无法将图像保存在我创建的文件夹中
Cannot save image in a folder that I created
我目前正在使用 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
工作得很好。
我认为是因为我创建的文件夹,但我找不到解决方案。
I think it's because of the folder that I created but I can't find a
solution.
错了 Directory.CreateDirectory
不存在的时候创建不了会抛出异常
所以让我们来解决您遇到的问题
\Originals\
不要这样做,如果你需要反斜杠使用@\Originals\
- 如果要合并路径,请使用
Path.Combine
- 可以使用
foreach
时不要使用 for
- 不需要做那么多列表和循环
- 如果你创建了一个图像,你需要处理它
- 最重要的是,不要尝试用打开的文件句柄保存文件。
在这种情况下,您需要退出代码并删除所有冗余。你的大部分代码绝对不需要,这会让你的生活更难调试
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
方法,或者您正试图用打开的句柄覆盖文件。然而,本着我认为你正在努力实现的精神,这可能会奏效
问题是您正在尝试覆盖现有文件。 Image.Save 方法不支持。
解决方法很简单,删除文件再保存:
File.Delete(selectedFileName);
selectedImages[k].Save(selectedFileName, GetImageFormat(Path.GetExtension(fileNames[k])));
我目前正在使用 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
工作得很好。
我认为是因为我创建的文件夹,但我找不到解决方案。
I think it's because of the folder that I created but I can't find a solution.
错了 Directory.CreateDirectory
不存在的时候创建不了会抛出异常
所以让我们来解决您遇到的问题
\Originals\
不要这样做,如果你需要反斜杠使用@\Originals\
- 如果要合并路径,请使用
Path.Combine
- 可以使用
foreach
时不要使用 - 不需要做那么多列表和循环
- 如果你创建了一个图像,你需要处理它
- 最重要的是,不要尝试用打开的文件句柄保存文件。
for
在这种情况下,您需要退出代码并删除所有冗余。你的大部分代码绝对不需要,这会让你的生活更难调试
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
方法,或者您正试图用打开的句柄覆盖文件。然而,本着我认为你正在努力实现的精神,这可能会奏效
问题是您正在尝试覆盖现有文件。 Image.Save 方法不支持。
解决方法很简单,删除文件再保存:
File.Delete(selectedFileName);
selectedImages[k].Save(selectedFileName, GetImageFormat(Path.GetExtension(fileNames[k])));