zoukankan      html  css  js  c++  java
  • WinForm版ListView图片查看小程序(用ListView显示某个文件夹中图片为缩略图,PictureBox显示大图)

    这个问题是在百度上看到的:


    为了解决这个问题看了花了大半天的时间啊,毕竟对ListView的一些基本操作不熟悉,做这个算是第一次近距离观察ListView了。
    解决方案不一定很完美,但是我是花了一番心思的,折腾了好半天才弄正常,仅仅是对ListView的摸索、学习。
    下面的代码中会有一些问题,比如文件的存在没有判断、一些小细节忽略了。有些注释是在写博客的时候添加的,可能格式不是很好。
    下面是一些总结,或者算是笔记吧。

    1.OpenFileDialog的基本设置
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.Multiselect = true;//设置 选择多个文件
                ofd.InitialDirectory = @"G:\images\";//设置初始目录  TODO:改为系统默认我的文档中的图片文件夹
                ofd.Multiselect = true;
                //ofd.Filter = "JPG(*.jpg)|*.jpg|JPEG(*.jpeg)|*.jpeg|PNG(*.png)|*.png|GIF(*.gif)|*.gif|所有文件(*.*)|*.*";
                ofd.Filter = "图片文件(*.jpg *.jpeg *.gif *.png)|*.jpg;*.jpeg;*.gif;*.png";
    

    2.ImageList的一些操作

            private ImageList GetImage(string[] files)//这个函数通过传入文件的路径的数组,获取图片到ImageList
            {
                ImageList list = new ImageList();
                for (int i = 0; i < files.Length; i++)
                { 
                    list.Images.Add(files[i], Image.FromFile(files[i]));//用Image.FromFile()函数直接获取图片文件到生成Image对象,然后添加到list.Images里面
                                                                        //注意这儿将图片的路径作为Key传到第一个参数,方便后面取出使用
                    list.ImageSize = new Size(60, 80);
                    //这个地方可是折腾我老半天的,以为可以在后面再设置缩略图的大小的,所以这儿最初没有设置,结果到后面设置起不了作用,得到的缩略图都是极其模糊                //的,后面附上没有这一句的效果图,list.ImageSize = new Size(60, 80);
                }
                return list;
            }
    

    3.对ListView的一些操作
    listView1.LargeImageList.Images.Add(list.Images.Keys[i], list.Images[i]);
    //这里就用到了上面说的作为key存储到ImageList.Images里的路径
    if (!listView1.Items.ContainsKey(files[index]))
    //添加图片前的判断,判断是否已经在列表里存在当前的文件了,用的是前面传进来的图片路径
    

    listView1.View = View.LargeIcon;//设置ListView的View属性为LargeIcon
    listView1.MultiSelect = false;//点击选择时 只能选择一个图片
    

            private void listView1_SelectedIndexChanged(object sender, EventArgs e)//点击图片时  在ListView的SelectedIndexChanged事件  切换图片
            {
                if (listView1.SelectedItems.Count == 1)
                {
                    pictureBox1.Image = Image.FromFile(listView1.SelectedItems[0].Name);//这里的要点是listView1.SelectedItems[0].Name,又是路径,找了半天才找                                                                                     //到用的是Name属性,以为应该是Key属性,可是没有找打
                    //MessageBox.Show(listView1.SelectedItems[0].Name);
                }
            }
    附上完整代码:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    
    namespace ListView2图片副本
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                //MessageBox.Show((GetImages() == null).ToString());
                listView1.View = View.LargeIcon;
                listView1.MultiSelect = false;
    
                string[] files = GetImages();
                if (files != null)
                {
                    ImageList list = GetImage(files);
                    if (listView1.LargeImageList == null)
                    {
                        listView1.LargeImageList = new ImageList();
                        listView1.LargeImageList.ImageSize = new Size(60, 80);
                    }
                    for (int i = 0; i < list.Images.Count; i++)
                    {
                        listView1.LargeImageList.Images.Add(list.Images.Keys[i], list.Images[i]);
                    }
    
                    int count = listView1.Items.Count;
                    if (files.Length == list.Images.Count)
                    {
                        for (int i = count; i < count + files.Length; i++)
                        {
                            int index = i - count;
                            FileInfo info = new FileInfo(files[index]);
                            //ListViewItem item = new ListViewItem(info.Name, i);
                            //item.Name = info.FullName;
    
                            if (!listView1.Items.ContainsKey(files[index]))
                            {
                                listView1.Items.Add(files[index], info.Name, i);
                            }
                            else
                            {
                                //listView1.LargeImageList.Images.RemoveByKey(files[index]);//用不着这一句
                                MessageBox.Show("已存在此图片:" + files[index] + ",不能重复添加!");
                            }
                        }
                        //listView1.LargeImageList = list;
                    }
                }
            }
    
            private ImageList GetImage(string[] files)
            {
                ImageList list = new ImageList();
                for (int i = 0; i < files.Length; i++)
                {
                    //Image image = Image.FromFile(files[i]);
                    list.Images.Add(files[i], Image.FromFile(files[i]));
                    list.ImageSize = new Size(60, 80);
                }
                return list;
            }
    
            private string[] GetImages()
            {
                OpenFileDialog ofd = new OpenFileDialog();
                ofd.Multiselect = true;//设置 选择多个文件
                ofd.InitialDirectory = @"G:\images\";//设置初始目录  TODO:改为系统默认我的文档中的图片文件夹
                ofd.Multiselect = true;
                //ofd.Filter = "JPG(*.jpg)|*.jpg|JPEG(*.jpeg)|*.jpeg|PNG(*.png)|*.png|GIF(*.gif)|*.gif|所有文件(*.*)|*.*";
                ofd.Filter = "图片文件(*.jpg *.jpeg *.gif *.png)|*.jpg;*.jpeg;*.gif;*.png";
                if (ofd.ShowDialog() == DialogResult.OK && ofd.FileNames != null)
                {
                    string[] files = ofd.FileNames;
                    return files;
                }
                else
                {
                    return null;
                }
            }
    
            private void listView1_SelectedIndexChanged(object sender, EventArgs e)
            {
                if (listView1.SelectedItems.Count == 1)
                {
                    pictureBox1.Image = Image.FromFile(listView1.SelectedItems[0].Name);
                    //MessageBox.Show(listView1.SelectedItems[0].Name);
                }
            }
        }
    }

    附上截图:


    点击这里下载源码

    最新修改的地方(2012-07-01 18:00)
    #原来的代码没有判断图片的大小,显示小图片时会被放大而变得很模糊,加上判断后调整PictureBox的SizeMode
            private void listView1_SelectedIndexChanged(object sender, EventArgs e)
            {
                if (listView1.SelectedItems.Count == 1)
                {
                    //MessageBox.Show(listView1.SelectedItems[0].Name);
                    //pictureBox1.Image = Image.FromFile(listView1.SelectedItems[0].Name);
                    Image image = Image.FromFile(listView1.SelectedItems[0].Name);
                    if (image.Width > pictureBox1.Width || image.Height > pictureBox1.Height)
                    {
                        pictureBox1.SizeMode = PictureBoxSizeMode.Zoom;
                    }
                    else
                    {
                        pictureBox1.SizeMode = PictureBoxSizeMode.CenterImage;
                    }
                    pictureBox1.Image = image;
                }
            }
    本博客(liqipeng)除非已明确说明转载,否则皆为liqipeng原创或者整理,转载请保留此链接:https://www.cnblogs.com/liqipeng/archive/2012/06/30/4576222.html

    本博客(liqipeng)除非已明确说明转载,否则皆为liqipeng原创或者整理,转载请保留此链接:https://www.cnblogs.com/liqipeng/archive/2012/06/30/4576222.html
    如果你觉得这篇文章对你有帮助或者使你有所启发,请点击右下角的推荐按钮,谢谢,:)
  • 相关阅读:
    SQL Server如何固定执行计划
    领导修炼
    content management system
    npm和bower
    web开发workflow
    偏执狂
    website project team member 角色及开发过程概念图
    website architecture
    王道霸道
    design pattern及其使用
  • 原文地址:https://www.cnblogs.com/liqipeng/p/4576222.html
Copyright © 2011-2022 走看看