获取图片并进行图片切换(FolderBrowserdDialog and OpenFileDialog用法)

发布时间 2023-11-05 13:35:12作者: 赵书记

winform布局如下图:

 获取文件夹按钮,通过FolderBrowserDialog对话框,选择本地电脑文件路径,后台代码实现如下:

         private void button1_Click(object sender, EventArgs e)
        {
            folderBrowserDialog1.Description = "请选择需要保存的路径";
            folderBrowserDialog1.RootFolder = Environment.SpecialFolder.Desktop;
            folderBrowserDialog1.ShowNewFolderButton = true;
            if (folderBrowserDialog1.SelectedPath.Length > 0)
            {
                folderBrowserDialog1.SelectedPath = textBox1.Text;
            }
            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = folderBrowserDialog1.SelectedPath;
            }
        }    
1. 首先,设置文件夹浏览对话框的描述信息、根目录和是否允许新建文件夹。

2. 如果文本框中有路径,则将其设置为文件夹浏览对话框的默认路径。

3. 显示文件夹浏览对话框,并等待用户选择文件夹路径。

4. 如果用户选择了路径,则将其设置为文本框中的路径。

总体来说,这段代码的作用是为用户提供一个选择文件夹路径的界面,并将用户选择的路径显示在文本框中,以便后续使用。

开始之前先熟悉两个常用的文件Dialog控件

FolderBrowserDialog控件

FolderBrowserDialog是一个我们并不常用的控件或者对象,但是当你只需要获取文件夹路径时,可以考虑使用。
接下来我们主要通过代码介绍FolderBrowserDialog控件的四个常见属性。

//创建一个FolderBrowserDialog对象
FolderBrowserDialog FBDialog = new FolderBrowserDialog();
  • description:可以在对话框提供说明,描述,提醒等信息
FBDialog.Description = "请选择包含img格式的文件夹";
  • RootFolder:可以设置对话框启动时候的根目录,主要为C盘里的文件夹,Desktop代表桌面

 

FBDialog.RootFolder = Environment.SpecialFolder.Desktop;
  • ShowNewFolderButton:是否在对话框设置“新建文件夹”按钮

 

FBDialog.ShowNewFolderButton = true;
  • SelectedPath:比较重要的属性,它是获取你选择的文件夹的路径,当然我们也可以记住每次需要打开的路径,可以避免每次都从桌面打开。
    //开始我们在btn_click()事件外定义一个空的字符串defaultfilePath
                
                if (defaultfilePath != string.Empty)
                {
                    //判断defaultfilePath是否为空,defaultfilePath不为空就可以直接赋值给SelectedPath,每次打开都可以到之前选择的位置
                    FBDialog.SelectedPath = defaultfilePath;
    
                }
                if (FBDialog.ShowDialog() == DialogResult.OK)
                {
                    //空就默认从桌面出发,然后获取点击的路径
                    defaultfilePath = FBDialog.SelectedPath;
                }

     

  • 完整代码
namespace FoldBrowserDialog
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private string defaultfilePath = string.Empty;
       private FolderBrowserDialog FBDialog;
        private void button1_Click(object sender, EventArgs e)
        {
            //新建一个FolderBrowserDialog对象
             FBDialog = new FolderBrowserDialog();
            /*
             * 下面介绍FolderBrowserDialog四个比较重要的属性或方法
             */

            //1、description属性,可以在对话框提供说明、描述、提醒等信息
            FBDialog.Description = "请选择包含img格式的文件夹";

            //2、RootFolder属性,可以设置对话框启动时的根目录,主要为C盘里的文件夹
            //下面Desktop默认打开桌面
            FBDialog.RootFolder = Environment.SpecialFolder.Desktop;

            //3、ShowNewFloderButton属性,是否在对话框中设置”新建文件夹“按钮
            FBDialog.ShowNewFolderButton = true;

            //4、selectedPath属性,比较重要的属性,它是获取你选择的文件夹的路径,当然
            //我们也可以记住我们每次需要打开的路径,可以避免每次都从桌面开始便利

            //开始我们在btn_click()事件外定义一个空的字符串defaultfilePath

            if (defaultfilePath != string.Empty)
            {
                //判断defaultfilePath是否为空,defaultfilePath不为空就可以直接赋值给SelectedPath,每次打开都可以到之前选择的位置
                FBDialog.SelectedPath = defaultfilePath;

            }
            if (FBDialog.ShowDialog() == DialogResult.OK)
            {
                //空就默认从桌面出发,然后获取点击的路径
                defaultfilePath = FBDialog.SelectedPath;
            }
            
        }
    }
}
  • 示例1:默认打开指定文件夹之后再选择文件夹
namespace FoldBrowserDialog
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private string defaultfilePath = string.Empty;
       private FolderBrowserDialog FBDialog;
        private void button1_Click(object sender, EventArgs e)
        {
            //新建一个FolderBrowserDialog对象
             FBDialog = new FolderBrowserDialog();
            /*
             * 下面介绍FolderBrowserDialog四个比较重要的属性或方法
             */

            //1、description属性,可以在对话框提供说明、描述、提醒等信息
            FBDialog.Description = "请选择包含img格式的文件夹";

            //2、RootFolder属性,可以设置对话框启动时的根目录,主要为C盘里的文件夹
            //下面Desktop默认打开桌面
            FBDialog.RootFolder = Environment.SpecialFolder.Desktop;

            //3、ShowNewFloderButton属性,是否在对话框中设置”新建文件夹“按钮
            FBDialog.ShowNewFolderButton = true;

            //4、selectedPath属性,比较重要的属性,它是获取你选择的文件夹的路径,当然
            //我们也可以记住我们每次需要打开的路径,可以避免每次都从桌面开始便利

            //开始我们在btn_click()事件外定义一个空的字符串defaultfilePath

            if (defaultfilePath != string.Empty)
            {
                //判断defaultfilePath是否为空,defaultfilePath不为空就可以直接赋值给SelectedPath,每次打开都可以到之前选择的位置
                FBDialog.SelectedPath = defaultfilePath;

            }
            if (FBDialog.ShowDialog() == DialogResult.OK)
            {
                //空就默认从桌面出发,然后获取点击的路径
                defaultfilePath = FBDialog.SelectedPath;
            }
            
        }
    }
}

 

  • 示例2:显示文件夹目录
namespace FoldBrowserDialog
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private string defaultfilePath = string.Empty;
       private FolderBrowserDialog FBDialog;
        private void button1_Click(object sender, EventArgs e)
        {
            //新建一个FolderBrowserDialog对象
             FBDialog = new FolderBrowserDialog();
            /*
             * 下面介绍FolderBrowserDialog四个比较重要的属性或方法
             */

            //1、description属性,可以在对话框提供说明、描述、提醒等信息
            FBDialog.Description = "请选择包含img格式的文件夹";

            //2、RootFolder属性,可以设置对话框启动时的根目录,主要为C盘里的文件夹
            //下面Desktop默认打开桌面
            FBDialog.RootFolder = Environment.SpecialFolder.Desktop;

            //3、ShowNewFloderButton属性,是否在对话框中设置”新建文件夹“按钮
            FBDialog.ShowNewFolderButton = true;

            //4、selectedPath属性,比较重要的属性,它是获取你选择的文件夹的路径,当然
            //我们也可以记住我们每次需要打开的路径,可以避免每次都从桌面开始便利

            //开始我们在btn_click()事件外定义一个空的字符串defaultfilePath

            if (defaultfilePath != string.Empty)
            {
                //判断defaultfilePath是否为空,defaultfilePath不为空就可以直接赋值给SelectedPath,每次打开都可以到之前选择的位置
                FBDialog.SelectedPath = defaultfilePath;

            }
            if (FBDialog.ShowDialog() == DialogResult.OK)
            {
                //空就默认从桌面出发,然后获取点击的路径
                defaultfilePath = FBDialog.SelectedPath;
            }
            
        }
    }
}

 

OpenFileDialog控件基本用法

OpenFileDialog控件的基本属性

  • InitialDirectory:对话框的初始目录
  • Filter:获取或设置当前文件名筛选器字符串,例如:"文本文件(*.txt)|*.txt|所有文件(*.*)||*.*"
  • FilterIndex:在对话框中选择的文件筛选器的索引,如果选第一项就设为1
  • RestoreDirectory控制对话框在关闭之前是否恢复当前目录
  • FileName:第一个在对话框中显示的文件或最后一个选取的文件
  • Title 将显示在对话框标题栏中的字符
  • AddExtension是否自动添加默认扩展名
  • CheckPathExists在对话框返回之前,检查指定路径是否存在
  • DefaultExt默认扩展名
  • DereferenceLinks 在从对话框返回前是否取消引用快捷方式
  • ShowHelp 启用"帮助"按钮 
  • ValiDateNames 控制对话框检查文件名中是否不含有无效的字符或序列

OpenFileDialog控件有以下常用事件

FileOk 当用户点击"打开"或"保存"按钮时要处理的事件 
HelpRequest 当用户点击"帮助"按钮时要处理的事件

下面用代码来实现上面的对话框

private void openFileDialogBTN_Click(object sender, System.EventArgs e)
{
    OpenFileDialog openFileDialog=new OpenFileDialog();
    openFileDialog.InitialDirectory="c:\\";//注意这里写路径时要用c:\\而不是c:\
    openFileDialog.Filter="文本文件|*.*|C#文件|*.cs|所有文件|*.*";
    openFileDialog.RestoreDirectory=true;
    openFileDialog.FilterIndex=1;
    if (openFileDialog.ShowDialog()==DialogResult.OK)
    {
        fName=openFileDialog.FileName;
        File fileOpen=new File(fName);
        isFileHaveName=true;
        richTextBox1.Text=fileOpen.ReadFile();
        richTextBox1.AppendText("");
    }
}

 获取对话框的文件名

openfiledialog.FileName //获取或设置一个包含在文件对话框中选定的文件名字符串

openfiledialog.SafeFileName  //获取选定对话框中的文件名和扩展名

 

 

 

回归正题(利用OpenFileDialog来浏览图片,并切换图片)

废话少说,直接上按钮“选择图片”的click代码

        private void button3_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();  //实例OpenFileDialog
            openFileDialog.Filter = "图片文件(*.jpg;*.png;*.jpeg;*.gif;*.bmp)|*.jpg;*.png;*.jpeg;*.gif;*.bmp"; //筛选需要的文件
            openFileDialog.RestoreDirectory = true; 
            openFileDialog.InitialDirectory = Environment.SpecialFolder.Desktop.ToString(); 
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                if (openFileDialog.FileName != null)
                {
                    pictureBox1.ImageLocation = openFileDialog.FileName; //选中的图片显示在控件上

                    list.Clear();

                    pictureDirctoryPath = Path.GetDirectoryName(openFileDialog.FileName);//获取文件所在的目录

                    this.GetFilesArry(pictureDirctoryPath);//读取文件夹内的文件,并依次赋值路径到list中

                    picturePage = list.IndexOf($"{openFileDialog.FileName}");
                }
                else { pictureBox1.ImageLocation = null; }

            }

        }

1. 首先创建了一个打开文件对话框对象openFileDialog,设置了文件过滤器,初始目录等属性。


2. 判断用户是否选择了文件,如果选择了则判断选择的文件是否为空,如果不为空则将选中的图片显示在pictureBox1控件上。


3. 清空list列表,获取选中图片所在的目录,并调用GetFilesArry()方法读取目录内的所有文件,将文件路径依次添加到list列表中。


4. 计算选中图片在list中的索引位置,赋值给picturePage变量,方便后面翻页时调用。


5. 如果选择的文件为空,则pictureBox1控件显示空。

 

声明一个存储文件的List,照片索引picturePageIndex
  List<string> list = new List<string>();
 int picturePage = -1;

GetFilesArry方法代码如下:
        public void GetFilesArry(string filePath)
        {
            DirectoryInfo dirInfo = new DirectoryInfo(filePath);
            foreach (var item in dirInfo.GetFiles())
            {
                string type = item.Extension.ToLower();
                if (type.Equals(".jpg") || type.Equals(".gif") || type.Equals(".jpge") || type.Equals(".png"))
                {
                    list.Add(item.FullName);
                }
            }
        }

1. 首先传入一个文件路径,使用DirectoryInfo类创建一个文件夹对象dirInfo。
2. 使用foreach循环遍历文件夹中的所有文件,使用GetFiles()方法获取文件数组。
3. 对于每一个文件,获取其文件类型的小写形式,判断是否是图片文件(.jpg、.gif、.jpge、.png)。
4. 如果是图片文件,将其完整路径添加到一个字符串列表list中

 

 

按钮“上一张”代码如下:

 private void button4_Click(object sender, EventArgs e)
 {
     if (picturePage == -1)
     {
         MessageBox.Show("请选择图片文件夹", "图片选择提示", MessageBoxButtons.OK);
         return;
     }
     if (picturePage == 0)
     {
         MessageBox.Show("已经是第一张照片", "图片选择提示", MessageBoxButtons.OK);
     }
     else
     {
         picturePage--;
         //pictureBox1.ImageLocation = dt.Rows[picturePage][0].ToString();
         pictureBox1.ImageLocation = list[picturePage];
     }
 }

 

按钮“下一张”代码如下

        private void button5_Click(object sender, EventArgs e)
        {
            if (picturePage == -1)
            {
                MessageBox.Show("请选择图片文件夹", "图片选择提示", MessageBoxButtons.OK);
                return;
            }
            if (picturePage + 1 < list.Count)
            {
                picturePage++;
                pictureBox1.ImageLocation = list[picturePage];
            }
            else
            {
                MessageBox.Show("已经是最后一张照片", "图片选择提示", MessageBoxButtons.OK);
            }
        }

 

运行效果如下图:

 “下一张”切换效果: