C# 系统应用之ListView实现简单图片浏览器

        最近有同学问我如何使用ListView加载图片列表,前面在"C#系统应用"中TreeView+ListView+ContextMenuStrip控件实现树状图显示磁盘目录,并在ListView中显示文件的详细信息.这里准备简单介绍下给同学讲述的如何使用ListView+ImageList控件实现简单的图片浏览器知识.
       第一步 设计界面框架如下图所示,同时添加ImageList控件(不可见)

 


        注意:设置ListView控件的Anchor属性为Top,Bottom,Right;设置PictureBox的Anchor属性为上下左右.
       第二步 使用OpenFileDialog控件打开显示图片

//打开图片
private void button1_Click(object sender, EventArgs e)
{
    //设置打开文件控件
    OpenFileDialog openfile = new OpenFileDialog();
    openfile.Filter = "JPG(*.JPG;*.JPEG);gif文件(*.GIF);BMP文件(*.BMP);PNG文件(*.PNG)|*.jpg;*.jpeg;*.gif;*.bmp;*.png";
    openfile.FilterIndex = 1;  //当前选定索引
    openfile.RestoreDirectory = true;
    openfile.FileName = "";
    //对话框选择确定按钮
    if (openfile.ShowDialog() == DialogResult.OK)
    {
        //FromFile从指定的文件创建Image
        pictureBox1.Image = Image.FromFile(openfile.FileName);
        //图片被拉伸或收缩适合pictureBox大小
        pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;               
    }
}

        图片显示效果如下图所示,需要注意的是在使用FromFile显示图片,可能图片全屏显示时会出现只出现部分图片现象,我设置图片为可拉伸或收缩StretchImage模式.


       第三步 显示图片列表至ListView控件中
        主要通过控件FolderBrowserDialog控件打开文件夹,同时获取文件夹的路径;在通过GetFiles("*.jpg")函数获取jpg格式图片,并获取文件夹中文件增加至ImageList中,设置ListView的View属性格式为LargeIcon大图标格式显示.

//添加命名空间
using System.IO;                   //Directory目录
using System.Diagnostics;          //Stopwatch显示时间

//定义变量
private string folderDirPath;                            //图片文件夹地址
private string picDirPath = null;                        //图片路径
private List<string> imagePathList = new List<string>(); //获取列表图片路径
private int index;                                       //获取选中列表图片序号

//ListView和imageList显示图片列表
private void button2_Click(object sender, EventArgs e)
{
    try
    {
        //打开选择文件夹对话框
        FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog();
        DialogResult result = folderBrowserDialog.ShowDialog();
        if (result == DialogResult.OK)
        {
            //获取用户选择的文件夹路径
            this.folderDirPath = folderBrowserDialog.SelectedPath;
            //调用自定义函数显示图片列表至ListView控件
            ShowPicture();
        }
        else if (result == DialogResult.Cancel)
        {
            MessageBox.Show("取消显示图片列表");
        }
    }
    catch (Exception msg)
    {
        //报错提示 未将对象引用设置到对象的实例
        throw msg;
    }     
}

//显示图片列表至ListView控件
private void ShowPicture()
{
    //提供一种方法测试运行时间 开始计算
    //参考资料:http://www.cnblogs.com/newstart/archive/2012/09/21/2696884.html
    Stopwatch sw = new Stopwatch();
    sw.Start();

    //获取目录与子目录
    DirectoryInfo dir = new DirectoryInfo(folderDirPath);
    //获取当前目录JPG文件列表 GetFiles获取指定目录中文件的名称(包括其路径)
    FileInfo[] fileInfo = dir.GetFiles("*.jpg");
    //防止图片失真
    //参考资料:http://blog.csdn.net/cdefg198/article/details/7821891 (博客中引用)
    this.imageList1.ColorDepth = ColorDepth.Depth32Bit;
    for (int i = 0; i < fileInfo.Length; i++)
    {
        //获取文件完整目录
        picDirPath = fileInfo[i].FullName;
        //记录图片源路径 双击显示图片时使用
        imagePathList.Add(picDirPath);
        //图片加载到ImageList控件和imageList图片列表
        this.imageList1.Images.Add(Image.FromFile(picDirPath));
    }

    //显示文件列表
    this.listView1.Items.Clear();
    this.listView1.LargeImageList = this.imageList1;
    this.listView1.View = View.LargeIcon;        //大图标显示
    //imageList1.ImageSize = new Size(40, 40);   //不能设置ImageList的图像大小 属性处更改

    //开始绑定
    this.listView1.BeginUpdate();
    //增加图片至ListView控件中
    for (int i = 0; i < imageList1.Images.Count; i++)
    {
        ListViewItem lvi = new ListViewItem();
        lvi.ImageIndex = i;
        lvi.Text = "pic" + i;
        this.listView1.Items.Add(lvi);
    }
    this.listView1.EndUpdate();

    //显示打开图片列表所需时间
    sw.Stop();
    long secords = sw.ElapsedMilliseconds; //毫秒单位
    label1.Text += '\n' + (Convert.ToDouble(secords) / 1000).ToString();  //转换为秒
}  

        显示结果如下图所示:
 


        需要注意的是:
        1.使用ListView加载信息的几个步骤:获取文件夹路径 -> DirectoryInfo获取目录 -> GetFiles获取文件 -> Add图片至ImageList -> Add图片至ListView.
        2.在设置ListView中图片的大小时,使用imageList1.ImageSize = new Size(40, 40)赋值失败,我是通过修改ImageList1的ImageSize属性为(64,64)实现的.
        3.显示ListView中图片,通常会出现失真的情况,主要原因参考博客:ListView显示图片失真.
        主要概括为ImageList里面图片颜色失真和图片大小失真,其中图片颜色失真原因是Design-Time在VS.NET中添加图片时没有使用用户指定的ColorDepth(如Depth32Bit),而用了ImageList.ColorDepth的默认值(Depth8Bit).因此需要先设置图片颜色深度,在再往ImageList中添加图片,而图片大小统一的都等于ImageList.ImageSize.
       第四步 通过listView1_DoubleClick函数双击打开图片

        在Form1.cs[设计]中ListView属性页为其添加DoubleClick双击事件,并通过Image.FromFile显示图片.

//增加双击ListView事件 显示图片至PictureBox
private void listView1_DoubleClick(object sender, EventArgs e)
{
    if (this.listView1.SelectedItems.Count == 0)
        return;
    //采用索引方式 imagePathList记录图片真实路径
    index = this.listView1.SelectedItems[0].Index;
    //显示图片
    this.pictureBox1.Image = Image.FromFile(imagePathList[index]);
    //图片被拉伸或收缩适合pictureBox大小
    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
}

        双击列表中不同图片的显示效果如下图所示:

        其中需要注意的是,我在列表中显示图片重命名为"pic+数字",同时定义变量记录文件夹中图片真实路径与其一一对应.private List<string> imagePathList = new List<string>().这里使用index显示对应图片即可,同样显示上一张\下一张相同.
       第五步 显示上一张\下一张

//显示上一张图片
private void button3_Click(object sender, EventArgs e)
{
    if (pictureBox1.Image != null)
    {
        if (index > 0)
        {
            index--;
            //显示图片
            this.pictureBox1.Image = Image.FromFile(imagePathList[index]);
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;                  
        }
        else if (index == 0)
        {
            index = imagePathList.Count;
            index--;
            //显示图片
            this.pictureBox1.Image = Image.FromFile(imagePathList[index]);
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;                  
        }
    }
}
//显示下一张图片
private void button4_Click(object sender, EventArgs e)
{
    if (pictureBox1.Image != null)
    {
        if (index == imagePathList.Count - 1) //最后一张图片
        {
            index = 0;
            //显示图片
            this.pictureBox1.Image = Image.FromFile(imagePathList[index]);
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
                 
        }
        else
        {
            index++;
            //显示图片
            this.pictureBox1.Image = Image.FromFile(imagePathList[index]);
            pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;                  
        }
    }
}   

        文章写到此处基本内容完成,内容比较简单,但也构成了一个完整的图片浏览器.同时很多时候我们需要上传缩略图,可以调用下面函数(在线笔记):

//添加命名空间
using System.Drawing.Drawing2D;    //CompositingQuality.HighQuality
using System.Drawing.Imaging;      //EncoderParameter

/// <SUMMARY>
/// 图片无损缩放 自定义函数生成缩略图
/// </SUMMARY>
/// <PARAM name="sourceFile">图片源路径</PARAM>
/// <PARAM name="destFile">缩放后图片输出路径</PARAM>
/// <PARAM name="destHeight">缩放后图片高度</PARAM>
/// <PARAM name="destWidth">缩放后图片宽度</PARAM>
/// <RETURNS></RETURNS>
public static bool GetThumbnail(string sourceFile, string destFile, int destHeight, int destWidth)
{
    System.Drawing.Image imgSource = System.Drawing.Image.FromFile(sourceFile);
    System.Drawing.Imaging.ImageFormat thisFormat = imgSource.RawFormat;
    int sW = 0, sH = 0;

    // 按比例缩放
    int sWidth = imgSource.Width;
    int sHeight = imgSource.Height;

    if (sHeight > destHeight || sWidth > destWidth)
    {
        if ((sWidth * destHeight) > (sHeight * destWidth))
        {
            sW = destWidth;
            sH = (destWidth * sHeight) / sWidth;
        }
        else
        {
            sH = destHeight;
            sW = (sWidth * destHeight) / sHeight;
        }
    }
    else
    {
        sW = sWidth;
        sH = sHeight;
    }

    //新建一个bmp图片  
    Bitmap outBmp = new Bitmap(destWidth, destHeight);
    //新建一个画板
    Graphics g = Graphics.FromImage(outBmp);
    //清空画布并以透明背景色填充 Color.Black黑色填充
    g.Clear(System.Drawing.Color.Transparent);
    //设置画布的描绘质量
    g.CompositingQuality = CompositingQuality.HighQuality;
    //设置高质量,低速度呈现平滑程度
    g.SmoothingMode = SmoothingMode.HighQuality;
    //设置高质量插值法
    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
    //在指定位置并且按指定大小绘制原图片的指定部分
    g.DrawImage(imgSource, new Rectangle((destWidth - sW) / 2, (destHeight - sH) / 2, sW, sH), 0, 0, imgSource.Width, imgSource.Height, GraphicsUnit.Pixel);
    g.Dispose();

    //以下代码为保存图片时 设置压缩质量
    EncoderParameters encoderParams = new EncoderParameters();
    long[] quality = new long[1];
    quality[0] = 100;
    EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
    encoderParams.Param[0] = encoderParam;

    try
    {
        //获得包含有关内置图像编码解码器的信息的ImageCodecInfo对象
        ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();
        ImageCodecInfo jpegICI = null;
        for (int x = 0; x < arrayICI.Length; x++)
        {
            if (arrayICI[x].FormatDescription.Equals("JPEG"))
            {
                jpegICI = arrayICI[x]; //设置JPEG编码
                break;
            }
        }
        //保存为JPG格式图片
        if (jpegICI != null)
        {
            outBmp.Save(destFile, jpegICI, encoderParams);
        }
        else
        {
            outBmp.Save(destFile, thisFormat);
        }

        return true;
    }
    catch(Exception e)
    {
        throw e;
    }
    finally
    {
        imgSource.Dispose();
        outBmp.Dispose();
    }
}

        总结:本文主要是根据给同学讲解ListView控件显示图片写的一篇文章,同时存在一个缺点图片可能被扯拉变形,而且代码中打开ListView图片时有个"打开时间",主要是通过Stopwatch记录批量打开图片所需时间,如果打开大量图片时我希望使用并行的方法实现,与其进行时间对比.同时如果对图片处理感兴趣的同学(C++通过Bitmap打开变换)自己可以去研究.我希望的显示效果想Google Picasa一样快速批量显示(研究ing).
        下载地址:http://download.csdn.net/detail/eastmount/8021077
        最后希望文章对大家有所帮助,如果有错误或不足之处,请海涵~
        (By:Eastmount 2014-10-10 中午13点 原创CSDN http://blog.csdn.net/eastmount/)

  • 10
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
第1章 Visual C#2008与窗体界面 案例1 飘动动画窗体 案例2 透明动画窗体 案例3 利用API函数实现动画窗体 案例4 闪烁动画窗体 案例5 滚动字幕动画窗体 案例6 超女卡通窗体 案例7 总在最前的登录窗体 案例8 在屏幕中央的圓形窗体 案例9 半透明的T形窗体 案例10 多文档MDI窗体 案例11 渐变色窗体 案例12 笑脸窗体 案例13 八边形图形窗体 本章小结 第2章 Visual C# 2008与图形图像 案例1 动态绘制直线和曲线 案例2 动态绘制验证码 案例3 椭圓及椭圆弧的绘制 案例4 移动鼠标复制坐标区域图像 案例5 动态获取当前程序的图标 案例6 动态获取系统图标 案例7 动态打开、显示和缩放图像 案例8 在图像上动态加载文字 案例9 水平和垂直遮罩图像动画效果 案例10 图像拉伸动画效果 案例11 百叶窗图像动画效果 案例12 翻转和扩展图像动画效果 案例13 图像的纹理和浮雕效果 案例14 图像的马赛克效果 本章小结 第3章 Visual C#2008与多媒体 案例1 抛物线动画效果 案例2 图像滚动动画效果 案例3 飞舞的雪花 案例4 电子时钟 案例5 Flash动画播放器 案例6 AvI动画播放器 案例7 GⅣ动画播放器 案例8 MP3音乐播放器 案例9 肥皂泡泡屏幕保护程序 案例1O 图像随机显示屏幕保护程序 案例11 滚动字幕屏幕保护程序 案例12 带有背景音乐的随机字幕屏幕保护程序 案例13 托盘动画图标程序 本章小结 第4章 Visual C#2006与数据库 案例1 利用DataGridView控件显示数据库信息 案例2 数据库数据记录单 案例3 利用下拉列表框动态查询数据库信息 案例4 利用ListView控件导航数据库信息 案例5 带有数据库的会员登录系统 案例6 动态添加数据库数据信息 案例7 动态修改数据库数据信息 案例8 动态删除数据库数据信息 案例9 带有图像信息的数据库数据记录单 案例10 分页显示数据库中的记录数据信息 案例11 连接Excel 2008表格 案例12 连接SQL Server数据库 本章小结 第5章 Visual C#2008的SQL查询与图表技朮 案例1 多表连接条件查询 案例2 分组条件查询 案例3 排序查询 案例4 嵌套查询 案例5 视图在Select查询语句中的应用 案例6 存储过程在Select查询语句中的应用 案例7 动态获取数据库中所有视图和存储过程 案例8 柱状图表分析图 案例9 柱状图表的升序和降序 案例10 折线图表分析图 案例11 多折线图表分析图 案例12 饼形图表分析图 本章小结 第6章 Visualc#2008的打印与水晶报表技术 案例1 利用Windows组件打印数据库中的数据 案例2 利用Windows组件打印数据库数据柱状图表 案例3 利用Windows组件打印输出图像 案例4 调用Word软件打印数据库中的数据 案例5 调用Excel软件打印数据库中的数据 案例6 利用水晶报表打印数据库中的数据 案例7 利用水晶报表分组统计数据库中的数据 案例8 利用水晶报表筛选数据库中的数据 案例9 图表在水晶报表中的应用 本章小结 第7章 VisualC#2008与Windows系统设置 案例1 任务栏的显示与隐藏 案例2 开始按钮的显示与隐藏 案例3 动态设置系统输入法 案例4 动态设置桌面颜色 案例5 动态设置鼠标的属性 案例6 动态获取鼠标位置 案例7 声卡的检测及声音,音频设备属性的设置 案例8 只能运行一次的托盘程序 案例9 动态设置程序是否为开机运行 案例10 动态设置注册表是否可运行 案例11 禁止修改IE浏览器的主页 案例12 动态锁定计算机 案例13 计算机的注销、关闭和重新启动 案例14 动态获取计算机系统基本信息 本章小结 第8章 VisualC#2008与文件 案例1 动态创建文件并输入文件内容 案例2 动态打开和保存文件 案例3 动态删除文件及清空回收站 案例4 动态创建和删除文件夹及显示其是否存在 案例5 动态获取文件夹中的文件 案例6 动态搜索文件或文件夹 案例7 动态显示磁盘容量图表 案例8 动态移动文件 案例9 动态复制文件 案例1O 动态调用可执行EXE文件 案例11 动态查看和修改文件属性 案例12 动态比较文件 本章小结 第9章 VisualC#2008算法及控件的应用 案例1 利用冒泡算法实现从小到大排序 案例2 利用希尔算法实现从大到小排序 案例3 判断主机IP合法性算法 案例4 欧几里德最大公因子算法 案例5 字符串的加密算法 案例6 随机生成新身份证算法 案例7 利用ListBox控件实现数据源字段的选择 案例8 利用LislNiew控件实现图标的管理 案
本书全面介绍创建功能强大的Windows应用程序的各种高级编程技术。具体内容包括:利用各种控件创建图形用户界面,在Windows应用程序中使用图形和GDI+,在标准Windows文件中加载和保存数据,通过应用程序打印信息,开发能够处理多文档的应用程序,链接数据库,提供帮助,部署应用程序等;同时,,通过创建实用的应用程序示例来展示这些编程技术的用法和技巧。 本书适合希望掌握如何使用Windows Forms创建功能强大、稳健且界面友好的Windows应用程序的开发人员。另外,本书读者还要求具备一定的C#编程基本技能并熟悉数据库的概念。 目录 第1章 Windows编程基础 1.1 Windows和窗体 1.1.1 Windows窗体的概念 1.1.2 System.Windows.Forms命名空间 1.2 Visual Studio.NET IDE简介 1.2.1 解决方案和项目 1.2.2 Toolbox和Properties窗口 1.2.3 动态帮助窗口 1.2.4 类现图 1.2.5 对象浏览器 1.2.6 代码编辑器 1.3 事件处理 1.3.1 使用消息框 1.3.2 使用IntelliSense 1.4 小结 第2章 简单用户界面控件 2.1 用户界面设计原则 2.2 漫游简单用户控件 2.2.1 PictureBox控件 2.2.2 Label控件 2.2.3 Textbox控件 2.2.4 List控件 2.2.5 基于按钮的控件 2.2.6 Bar控件 2.3 小结 第3章 高级用户界面控件 3.1 高级控件简介 3.2 概述 3.2.1 TabControl控件 3.2.2 TreeView控件和ListView控件 3.2.3 Splitter控件 3.2.4 DataTimePicker控件 3.2.5 MonthCalendar控件 3.3 控制光标外观 3.4 小结 第4章 菜单和工具栏 4.1 菜单控件和类 4.1.1 创建主菜单 4.1.2 创建上下文菜单 4.2 工具栏控件和类 4.2.1 创建工具栏 4.2.2 显示/隐藏工具栏 4.3 小结 第5章 使用图形 5.1 设备语境 5.2 Graphics类 5.2.1 使用Graphics类 5.2.2 Graphics类的方法 5.3 指定位置、大小和颜色 5.3.1 位置和大小 5.3.2 颜色 5.4 绘制线条和外形 5.4.1 Pen类 5.4.2 画图方法 5.4.3 按要求画图 5.5 颜色填充 5.5.1 刷子工具 5.5.2 填充方法 5.6 使用文本 5.7 图像 5.8 小结 第6章 打印 6.1 System.Drawing.Printing命名空间 6.2 打印图像 6.2.1 更改页面设置 6.2.2 打印对话框 6.2.3 保持高宽比 6.3 打印多页 6.3.1 分页 6.3.2 添加页眉 6.4 小结 第7章 链接数据库 第8章 文件和注册表操作 第9章 使用文档/视图模式 第10章 提供帮助 第11章 部署Windows应用程序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eastmount

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值