在 C# 中使用 SaveFileDialog 保存为特定文件格式

Posted

技术标签:

【中文标题】在 C# 中使用 SaveFileDialog 保存为特定文件格式【英文标题】:Saving to a specific file format with SaveFileDialog in C# 【发布时间】:2015-03-02 11:04:20 【问题描述】:

我正在使用图片框来编辑图像,并使用文件保存对话框来保存图像。

我遇到的问题是,无论我选择哪种文件格式,文件都保存为位图。我在这里做了一些研究并尝试进行一些更改,但它们不起作用。该对话框尝试保存文件 5 次,然后失败。我的感觉是我没有成功选择文件格式/文件扩展名。

我正在尝试几种不同的方法,但它们都不起作用。我在这里阅读了我应该使用的堆栈溢出(Path.GetExtension(save.FileName)),但编译器拒绝了Path.GetExtension(当前上下文中不存在路径)。这是我的代码,如果有人能指出我的错误所在,我将不胜感激。


    SaveFileDialog save = new SaveFileDialog();
    save.Filter = "Bitmap files (*.bmp)|*.bmp|JPG files (*.jpg)|*.jpg|GIF files (*.gif)|*.gif|PNG files (*.png)|*.png|TIF files (*.tif)|*.tif|All files (*.*)|*.*";
    save.FilterIndex = 4;
    save.RestoreDirectory = true;
    save.OverwritePrompt = true;
    save.ShowHelp = true;
    save.AddExtension = true;

    if (save.ShowDialog() == DialogResult.OK && save.FilterIndex == 1)  
        pictureBox1.Image.Save(save.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
    if (save.ShowDialog() == DialogResult.OK &&  save.FileName.Substring(save.FileName.Length - 4) == ".jpg") 
        pictureBox1.Image.Save(save.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
    if (save.ShowDialog() == DialogResult.OK && save.FileName.Substring(save.FileName.Length - 3) == "gif")
        pictureBox1.Image.Save(save.FileName, System.Drawing.Imaging.ImageFormat.Gif);
    if (save.ShowDialog() == DialogResult.OK && save.FileName.Substring(save.FileName.Length - 3) == "png") 
        pictureBox1.Image.Save(save.FileName, System.Drawing.Imaging.ImageFormat.Png);
    if (save.ShowDialog() == DialogResult.OK && save.FileName.Substring(save.FileName.Length - 3) == "tif")
        pictureBox1.Image.Save(save.FileName, System.Drawing.Imaging.ImageFormat.Tiff);
    else 
        MessageBox.Show("File Save Error."); 

另外,有没有办法在 C# 中访问文件保存选项(例如,在 jpg 中进行二次采样或在 gif 中进行抖动)?

谢谢

【问题讨论】:

请清理代码并调试它,看看有什么问题。您测试OK 5 次,而只有 1 次就足够了,以三种不同的方式检查文件的扩展名 5 次只需检查一次 OK,获取文件名一次,然后在调试器中检查它的值是多少。如果您有编译器错误,只需通过添加缺少的命名空间或库来修复它。只需搜索 Path.GetExtension 即可显示要使用的命名空间。此外,我认为 Visual Studio 本身提出了在上下文菜单中添加命名空间的修复方法 您只检查了一次 FilterIndex。您需要检查所有分支! 另外:你的Substring()是假的,使用Path.GetExtension() 还有:你的意思是“else if”,而不仅仅是“if”。 Panagiotis Kanavos:我没有意识到 Path.GetExtension 是一个命名空间问题。我已经学习了 6 周的 C# 入门课程,我们甚至还没有处理过 Windows 窗体和控件,我会错过对有经验的用户来说显而易见的东西。谢谢你指出。 TaW:是的,你是对的。我尝试了 3 种不同的测试文件扩展名的方法,这就是为什么我只使用了一次。你总是一个巨大的帮助,谢谢。 DrKoch:Path.GetExtension 有效,谢谢。 Mike Nakis:正确,我不应该半睡半醒,谢谢。 【参考方案1】:

只是想发布对其他提出相同问题的人有用的方法。感谢以上所有人的帮助。

使用系统.IO;

        SaveFileDialog save = new SaveFileDialog();
        save.Filter = "Bitmap files (*.bmp)|*.bmp|JPG files (*.jpg)|*.jpg|GIF files (*.gif)|*.gif|PNG files (*.png)|*.png|TIF files (*.tif)|*.tif|All files (*.*)|*.*";
        save.FilterIndex = 2;
        save.RestoreDirectory = true;
        save.OverwritePrompt = true;
        save.ShowHelp = true;
        save.AddExtension = true;

        if ((save.ShowDialog() == DialogResult.OK))  
            if (Path.GetExtension(save.FileName).ToLower() == ".bmp")
                pictureBox1.Image.Save(save.FileName, System.Drawing.Imaging.ImageFormat.Bmp);
            else if (Path.GetExtension(save.FileName).ToLower() == ".jpg")
                pictureBox1.Image.Save(save.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
            else if (Path.GetExtension(save.FileName).ToLower() == ".gif")
                pictureBox1.Image.Save(save.FileName, System.Drawing.Imaging.ImageFormat.Gif);
            else if (Path.GetExtension(save.FileName).ToLower() == ".png")
                pictureBox1.Image.Save(save.FileName, System.Drawing.Imaging.ImageFormat.Png);
            else if (Path.GetExtension(save.FileName).ToLower() == ".tif")
                pictureBox1.Image.Save(save.FileName, System.Drawing.Imaging.ImageFormat.Tiff);
            else
                MessageBox.Show("File Save Error.");

由于某种原因,PNG 比 TIF 节省的空间略大,PNG 应该小 33% 左右,我怀疑这是 Visual Studio PNG 实现的问题。对于任何对真正的小型 PNG 感兴趣的人,有一个名为 PNGcrush 的开源控制台应用程序。

【讨论】:

以上是关于在 C# 中使用 SaveFileDialog 保存为特定文件格式的主要内容,如果未能解决你的问题,请参考以下文章

c# savefiledialog 锁定到特定目录? [复制]

C# OpenFileDialog和SaveFileDialog:打开文件与保存文件

C# Open/SaveFileDialog 使用不同的文件系统

C#中SaveFileDialog 和OpenFileDialog 的用法

c# savefiledialog 保存特定长度的文本

C# SaveFileDialog 从多个扩展名中设置一个在未键入扩展名时自动添加扩展名