观看 陈广 老师视频做的图像管理器,代码打包,给需要的朋友。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO; namespace 图片管理器 { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private string path = Application.StartupPath + "\\图片目录"; private void MainForm_Load(object sender, EventArgs e) { try { if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } } catch (Exception ex) { MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } DirectoryInfo dir = new DirectoryInfo(path); foreach (DirectoryInfo d in dir.GetDirectories())//获取dir中的目录 { Folder folder = new Folder(Application.StartupPath,d.Name); lstFolder.Items.Add(folder);//这样的话lstFolder中显示的可不是图片目录中的子目录 //lstFolder.Items.Add(folder.Name); } } private void tsbtnCreateFolder_Click(object sender, EventArgs e) { FrmCreateFolder frmCreateFolder = new FrmCreateFolder(this.lstFolder); try { frmCreateFolder.ShowDialog(this); } finally { frmCreateFolder.Dispose(); } } private void tsbtnLoad_Click(object sender, EventArgs e) { FrmLoadPic frmLoadPic = new FrmLoadPic(this.lstFolder, this.statusStrip1); try { if (frmLoadPic.ShowDialog(this) == DialogResult.OK) { //LoadToListView(); } } finally { frmLoadPic.Dispose();//销毁窗体 } } } }
陈老师c#讲得确实很好,参照视频写的图像管理器运行成功。分享出来,方便大家参考。
PicInfo类:
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.IO; 5 6 namespace 图片管理器 7 { 8 class PicInfo 9 { 10 private string _fullName;//原文件的全路径名称 11 private string _nameNoExtension;//更改后的名称 12 public PicInfo (string path) 13 { 14 _fullName = path; 15 _nameNoExtension = Path.GetFileNameWithoutExtension(path); 16 } 17 //需要通过属性对私有成员变量进行修改 18 public string NameNoExtension //属性 19 { 20 get 21 { 22 return _nameNoExtension; 23 } 24 set 25 { 26 if (value != "" && value.IndexOf('.') == -1)//如果在 SortedList 中找到 value,则为 value 的第一个匹配项的从零开始的索引;否则为 -1。 27 //也就是说没有_nameNoExtension中无'.',这时_nameNoExtensions是没有后缀名的 28 { 29 _nameNoExtension = value; 30 } 31 } 32 } 33 public string FullName//属性 34 { 35 get 36 { 37 return _fullName; 38 } 39 set 40 { 41 _fullName = value; 42 } 43 } 44 //获得文件后缀名的方法 45 public string GetExtension() 46 { 47 return Path.GetExtension(_fullName); 48 } 49 public static bool IsImage(string path) //判断文件是否为图像,静态方法占用一份空间,不用像实例方法一样,每创建一个对象都要创建相应的空间 50 { 51 // *.BMP;*.JPG;*.GIF;*.jpeg;*.ico 52 string ext = Path.GetExtension(path).ToUpper(); 53 if (ext == ".BMP" || ext == ".JPG" || ext == ".GIF" 54 || ext ==".JPEG" || ext == ".ICO") 55 { 56 return true;//该文件是图像类型 57 } 58 else 59 { 60 return false; 61 } 62 } 63 64 } 65 }
Folder类:
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.IO;
using System.Drawing;
namespace 图片管理器
{
class Folder
{
private string _name;//目录名称,文件夹名称
private bool _isLoaded;//是否已经把缩略图载入内存
private string _sourcePath;//图像存放的路径
private string _thumbnailPath;//缩略图的路径
public Hashtable bmps;//用于在内存中保存图像的缩略图,hashtable有一个键(存放图像名称)和值(存放图像的缩略图)。
public Folder(string exePath,string name)
{
_name = name;
_sourcePath = exePath + "\\图片目录\\" + name;
_thumbnailPath = exePath + "\\缓存目录\\" + name;
_isLoaded = false;
if (!Directory.Exists(_sourcePath))
{
Directory.CreateDirectory(_sourcePath);
}
if (!Directory.Exists(_thumbnailPath))
{
Directory.CreateDirectory(_thumbnailPath);
}
}
public bool IsLoaded //只读属性
{
get
{
return _isLoaded;
}
}
public string Name //只读属性,表示文件夹名称
{
get
{
return _name;
}
}
public string GetSourcePath()//获得源路径,也可以声明为属性
{
return _sourcePath;
}
public string GetThubnailPath()//获得缩略图存放路径,也可以声明为属性
{
return _thumbnailPath;
}
public Bitmap GetThubnail(string sourceName)// 通过图像名称获取相应的缩略图
{
return (Bitmap)bmps[sourceName];
}
public Bitmap GetImage(string aName) // 通过图像名称获取相应的图像
{
Bitmap bmp = new Bitmap(_sourcePath + "\\" + aName);
return bmp;
}
public void LoadImage()//用于把目录中所有缩略图载入到内存中
{
if (bmps == null)
{
bmps = new Hashtable();
}
foreach (string sourceFile in Directory.GetFiles(_sourcePath))
{
if (!PicInfo.IsImage(sourceFile))//调用PicInfo类的静态方法IsImage方法,判断文件是否是图像文件
{
continue;
}
string picName = Path.GetFileNameWithoutExtension(sourceFile) + ".BMP";
string thumbailFile = _thumbnailPath + "\\" + picName;
if (!File.Exists(thumbailFile))//如果缩略图不存在,创建缩略图
{
CreateThumbnail(sourceFile, thumbailFile);
}
bmps.Add(Path.GetFileName(sourceFile), new Bitmap(thumbailFile));
}
_isLoaded = true;//通过_isLoaded变量标志目录下的所有缩略图都载入到目录中
}
private bool ThumbnailCallback()//CreaeThumbail方法需要调用
{
return false;
}
public void Add(string aName)
{
string picName = Path.GetFileNameWithoutExtension(aName) + ".BMP";
string sourceFile = _sourcePath + "\\" + aName;
string thumbnailFile = _thumbnailPath + "\\" + picName;
CreateThumbnail(sourceFile, thumbnailFile);
bmps.Add(Path.GetFileName(sourceFile), new Bitmap(thumbnailFile));
}
private void CreateThumbnail(string source,string dest) //创建缩略图
{
Image.GetThumbnailImageAbort myCallback =
new Image.GetThumbnailImageAbort(ThumbnailCallback);
Bitmap bmp = new Bitmap(source);
int x = bmp.Width;
int y = bmp.Height;
try
{
if ( x > 100 || y > 100)
{
float scale = (x > y) ? (x / 100F) : (y / 100F);
Image aThumbnail =
bmp.GetThumbnailImage((int)(x / scale), (int)(y / scale), myCallback,
IntPtr.Zero);
aThumbnail.Save(dest);
}
else
{
bmp.Save(dest);
}
}
catch (Exception ex )
{
throw ex;
}
finally
{
bmp.Dispose();//释放由System.Drawing.Image使用的所有资源
}
}
//重写ToString()方法
public override string ToString()
{
// return base.ToString();//这个是没有重写的
return _name;//这个是重写的,如果没有重写,在lstFolder.Items.Add(folder)中将无法正确显示子目录;
//这是因为lstFolder.Items.Add(folder)的参数为字符串,folder对象需要隐式转换为string,即调用ToString()方法。
}
}
}
FrmCreateFolder类:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Text; 7 using System.Windows.Forms; 8 using System.IO; 9 10 namespace 图片管理器 11 { 12 public partial class FrmCreateFolder : Form 13 { 14 public FrmCreateFolder() 15 { 16 InitializeComponent(); 17 } 18 19 public FrmCreateFolder(ListBox lst)//通过构造函数调用主窗体的lstFolder 20 { 21 InitializeComponent(); 22 lstFolder = lst; 23 } 24 private ListBox lstFolder; 25 private void btnCancel_Click(object sender, EventArgs e) 26 { 27 this.Close();//关闭窗体 28 29 } 30 31 private void btnOk_Click(object sender, EventArgs e) 32 { 33 if (txtFolderName.Text == "") 34 { 35 MessageBox.Show("请在文本框中输入要新建的目录名称", "消息", 36 MessageBoxButtons.OK, MessageBoxIcon.Hand); 37 return; 38 } 39 try 40 { 41 string path = Application.StartupPath + "\\图片目录\\" + 42 txtFolderName.Text; 43 // MessageBox.Show(path); 44 if (Directory.Exists(path)) 45 { 46 MessageBox.Show("“" + txtFolderName.AcceptsReturn + "”" + 47 "目录已经存在,请输入另一个名称!", 48 "消息对话框", MessageBoxButtons.OK, MessageBoxIcon.Error); 49 return; 50 } 51 52 Directory.CreateDirectory(path);//建立目录 53 54 // lstFolder.Items.Add(txtFolderName.Text);// 这个是以前的代码 55 //现在的是Folder对象,添加的类型的也是items add 的也是folder类型 56 Folder folder = new Folder(Application.StartupPath, txtFolderName.Text); 57 lstFolder.Items.Add(folder);//folder隐式调用其ToString()方法 58 59 } 60 catch (Exception ex) 61 { 62 MessageBox.Show(ex.Message, "错误", 63 MessageBoxButtons.OK, MessageBoxIcon.Error); 64 return; 65 66 } 67 Close();//运行成功的话,关闭窗口。 68 } 69 } 70 }
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Text; 7 using System.Windows.Forms; 8 using System.IO; 9 using System.Collections; 10 11 namespace 图片管理器 12 { 13 public partial class FrmLoadPic : Form 14 { 15 public FrmLoadPic() 16 { 17 InitializeComponent(); 18 } 19 //重载的构造函数,参数方便对主窗体的lstFolder和StatusStrip控件进行控制 20 public FrmLoadPic(ListBox lst, StatusStrip sta) 21 { 22 InitializeComponent();//初始化函数 23 lstFolder = lst; 24 staMsg = sta; 25 openFileDialogSelPic.Filter = "图像文件(*.BMP,*.JPG,*.GIF;" + 26 "*.jpeg;*.ico)|*.BMP;*.JPG;*.GIF;*.jpeg;*.ico"; 27 28 } 29 private ListBox lstFolder;//定义私有的ListBox类型的对象。 30 private StatusStrip staMsg; 31 32 private void FrmLoadPic_Load(object sender, EventArgs e) 33 { 34 foreach (object o in lstFolder.Items) 35 { 36 cbFolder.Items.Add(o); 37 } 38 if (lstFolder.SelectedItems.Count !=0) 39 { 40 cbFolder.SelectedIndex = lstFolder.SelectedIndex; 41 } 42 else 43 { 44 cbFolder.SelectedIndex = 0; 45 } 46 } 47 48 private void btnSelPic_Click(object sender, EventArgs e) 49 { 50 if (openFileDialogSelPic.ShowDialog() == DialogResult.OK) 51 { 52 foreach (string s in openFileDialogSelPic.FileNames) 53 { 54 if (!chklsPics.Items.Contains(s) && PicInfo.IsImage(s))//使用PicInfo类的静态方法IsImage,判断文件是否是图像文件 55 56 { 57 PicInfo picInfo = new PicInfo(s); 58 chklsPics.Items.Add(picInfo, true); 59 } 60 } 61 } 62 } 63 64 private void chklsPics_SelectedIndexChanged(object sender, EventArgs e) 65 { 66 txtPicName.Text = ((PicInfo)chklsPics.SelectedItem).NameNoExtension;//把chklsPics中的Item项目强制类型转换为原来的PicInfo类型 67 } 68 69 private void btnUpdateName_Click(object sender, EventArgs e) 70 { 71 if (chklsPics.SelectedItems.Count !=0) 72 { 73 ((PicInfo)chklsPics.SelectedItem).NameNoExtension = txtPicName.Text; 74 } 75 } 76 77 private void btnOK_Click(object sender, EventArgs e) 78 { 79 if (chklsPics.Items.Count ==0) 80 { 81 return; 82 } 83 ArrayList names = new ArrayList();//存放目的文件夹中已有文件名称 84 Folder folder = (Folder)cbFolder.SelectedItem; 85 if (!folder.IsLoaded) 86 { 87 folder.LoadImage(); 88 } 89 string path = folder.GetSourcePath(); 90 names.AddRange(Directory.GetFiles(path)); 91 for ( int i = 0; i < names.Count; i++) 92 { 93 names[i] = 94 Path.GetFileNameWithoutExtension((string)names[i]).ToUpper(); 95 } 96 names.Sort(); 97 ToolStripProgressBar bar = (ToolStripProgressBar)staMsg.Items[0]; 98 bar.Visible = true; 99 this.Cursor = Cursors.WaitCursor;//设置鼠标指针样式 100 try 101 { 102 int i = 1; //制定图像序号,用于进度条中的进度显示 103 int count = chklsPics.CheckedItems.Count; 104 foreach (PicInfo p in chklsPics.CheckedItems) 105 { 106 staMsg.Items[1].Text = ""; //清空状态栏文字 107 string name = InsertAName(p.NameNoExtension,names); 108 string destFile = path + "\\" + name + p.GetExtension(); 109 File.Copy(p.FullName, destFile); //拷贝图像到图片存储目录中 110 folder.Add(name + p.GetExtension()); 111 bar.Value = 100 * i / count; //在进度条中显示进度 112 i++; 113 } 114 } 115 catch (Exception ex) 116 { 117 MessageBox.Show(ex.Message, "错误", 118 MessageBoxButtons.OK, MessageBoxIcon.Error); 119 return; 120 } 121 finally 122 { 123 this.Cursor = Cursors.Default; 124 bar.Visible = false; 125 } 126 int index = lstFolder.FindString(cbFolder.Text); 127 if (lstFolder.SelectedIndex!=index) 128 { 129 lstFolder.SelectedIndex = index; 130 } 131 this.DialogResult = DialogResult.OK; //可用于关闭模式窗体 132 133 } 134 private string InsertAName(string aName, ArrayList names) 135 { 136 //在一个名称集合中插入指定的名称 137 int nameExtend = 0; //用于出现相同名称时,在文件后面添加的数字 138 string tempName = aName;//要插入的文件名 139 int namesCount = names.Count; 140 for (int i=0;i < namesCount;i++) 141 { 142 string name = (string)names[i]; 143 if (tempName.ToUpper().CompareTo(name) == 0) //如果文件同名 144 { 145 //在文件名后添加减号和数字零 146 nameExtend++; 147 tempName = Path.GetFileNameWithoutExtension(aName) 148 + "-" + nameExtend.ToString(); 149 } 150 if (tempName.ToUpper().CompareTo(name) == -1) 151 { 152 //如果文件名小于名称集合中的某个名称,则插入 153 names.Insert(i, tempName); 154 break; 155 } 156 if (i == namesCount - 1) 157 { 158 //如果到达名称集合底部,则直接添加。 159 names.Add(tempName); 160 } 161 } 162 return tempName;//返回新的文件名 163 } 164 } 165 }
浙公网安备 33010602011771号