最近有同学问我怎么用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/)
版权声明:本文博主原创文章。博客,未经同意不得转载。
C# L该系统的应用istView简单的图像浏览器的更多相关文章
-
大麦盒子(domybox)无法进入系统解决方案!【简单几步】
大麦无法进入系统解决方案![简单几步]前提准备:电脑一台盒子控制台软件盒子开机并联网并且盒子和电脑处于同一个路由器下的网络! 前提准备:电脑一台盒子控制台软件盒子开机并联网并且盒子和电脑处于同一个路由 ...
-
Linux系统下MongoDB的简单安装与基本操作
这篇文章主要介绍了Linux系统下MongoDB的简单安装与基本操作,需要的朋友可以参考下 Mongo DB ,是目前在IT行业非常流行的一种非关系型数据库(NoSql),其灵活的数据存储方式,备 ...
-
Davinci 可视化系统部署安装及简单使用
Davinci 是一个目前比较热门的国内开源BI系统,功能比较完善,各种可视化效果也挺不错.主要获取数据的方式是通过编写SQL 创建数据视图来展示各种图表的. Davinci面向业务人员/数据工程师/ ...
-
Python用Pillow(PIL)进行简单的图像操作
Python用Pillow(PIL)进行简单的图像操作 颜色与RGBA值 计算机通常将图像表示为RGB值,或者再加上alpha值(通透度,透明度),称为RGBA值.在Pillow中,RGBA的值表示为 ...
-
基于qml创建最简单的图像处理程序(3)-使用opencv&;qml进行图像处理
<基于qml创建最简单的图像处理程序>系列课程及配套代码基于qml创建最简单的图像处理程序(1)-基于qml创建界面http://www.cnblogs.com/jsxyhelu/p/83 ...
-
CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能
CSharpGL(24)用ComputeShader实现一个简单的图像边缘检测功能 效果图 这是红宝书里的例子,在这个例子中,下述功能全部登场,因此这个例子可作为使用Compute Shader的典型 ...
-
忘记常访问网站密码怎么办?教你如何查看浏览器已保存的密码,如何简单查看Chome浏览器保存的密码?
利用场景: 同事或朋友外出有事,电脑未锁屏离开座位.可以利用这一间隙,查看Ta在Chrome浏览器上保存的账号密码 查看逻辑: 当我们要查看Chrome浏览器上保存的密码时,点击显示,会弹出一个对话框 ...
-
四种简单的图像显著性区域特征提取方法-----AC/HC/LC/FT。
四种简单的图像显著性区域特征提取方法-----> AC/HC/LC/FT. 分类: 图像处理 2014-08-03 12:40 4088人阅读 评论(4) 收藏 举报 salient regio ...
-
简单的图像显著性区域特征提取方法-----opencv实现LC,AC,FT
https://blog.csdn.net/cai13160674275/article/details/72991049?locationNum=7&fps=1 四种简单的图像显著性区域特征 ...
随机推荐
-
Linq语法详细
闲言碎语 近期比较忙,但还是想写点什么,就分享一些基础的知识给大家看吧,希望能帮助一些linq新手,如果有其它疑问,可以进右上角群,进行交流探讨,谢谢. 开门见山 读这篇文章之前,我先说下,每一种搜索 ...
-
ExtJs 学习之开篇(-)之define
Ext.onReady(function(){ /** * test1,声明一个类,定义类中的方法 */ Ext.define("demo.Demo",{ ...
-
Visual Studio 在调试时启用编辑功能
Visual Studio边调试边修改 如果你在调试一个web应用程序的时候,想进行编辑,可以有如下两种方法: 方法一:在web项目的属性页里的web标签页,选中"启用编辑并继续&qu ...
-
SWF READER 破解日志。
网上传闻swf reader是破解最厉害的神器,可以内存抓取+doSWF反编译.所以去官网下了一个: SWF_Reader_2.3 不出所料,demo版本没有反编译的功能.网上搜到一个哥们尝试了下: ...
-
java的多线程总结
在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 对于直接继承Thread的类来说,代码大致框架是: class 类名 extends Thread ...
-
C# 实现抓取网站页面内容
抓取新浪网的新闻栏目,如图所示: 使用 谷歌浏览器的查看源代码: 通过分析得知,我们所要找的内容在以下两个标签之间: <!-- publish_helper name='要闻-新闻' p_id= ...
-
unix解释器文件详解
exec执行普通文件和解释器文件的区别 2014-11-15 23:52:45 分类: LINUX exec执行普通文件和解释器文件的区别 ——lvyilong316 1. 从一个问题开始 首先要从项 ...
-
(转载)Java多线程入门理解
转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更 ...
-
FeatureTools
featuretools一种自动特征工程的工具.可快速生成较多类型的特征,取得不错的效果. 1.输入:把原始数据转换成featuretools的输入 2. 可以适当调整特征个数,防止训练的模型过拟合 ...
-
Android框架式编程之MVP架构
MVP(Model-View-Presenter)模式.是将APP的结构分为三层:View - Presenter - Model. View 1. 提供UI交互 2. 在presenter的控制下修 ...