制作一个简单的WPF图片浏览器
这里将实现以下几个功能:
1. 对指定文件夹下所有JPG文件进行预览
2. 对选定片进行旋转
3. 对选定片进行灰度处理
4. 对选定片进行裁切处理
5. 无限制的恢复功能
6. 类似加入购物车的功能
以下来看看其实现过程。
1. 建立一个ImageFile类,用来读取像文件:
- // ImageFile.cs
- using System;
- using System.Collections.Generic;
- using System.Windows.Media.Imaging;
- using System.Text;
- namespace PhotoDemo
- {
- public class ImageFile
- {
- private String _path;
- public String Path { get { return _path; } }
- private Uri _uri;
- public Uri Uri { get { return _uri; } }
- private BitmapFrame _image;
- public BitmapFrame Image { get { return _image; } }
- public ImageFile(string path)
- {
- _path = path;
- _uri = new Uri(_path);
- _image = BitmapFrame.Create(_uri);
- }
- public override string ToString()
- {
- return Path;
- }
- }
- }
2. 建立一个像列表的类,用于取得指定目录下的所有jpg像文件:
- // PhotoList.cs
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.IO;
- using System.Text;
- namespace PhotoDemo
- {
- public class PhotoList : ObservableCollection<ImageFile>
- {
- DirectoryInfo _directory;
- public DirectoryInfo Directory
- {
- set
- {
- _directory = value;
- Update();
- }
- get { return _directory; }
- }
- public string Path
- {
- set
- {
- _directory = new DirectoryInfo(value);
- Update();
- }
- get { return _directory.FullName; }
- }
- public PhotoList() { }
- public PhotoList(DirectoryInfo directory)
- {
- _directory = directory;
- Update();
- }
- public PhotoList(string path) : this(new DirectoryInfo(path)) { }
- private void Update()
- {
- foreach (FileInfo f in _directory.GetFiles("*.jpg"))
- {
- Add(new ImageFile(f.FullName));
- }
- }
- }
- }
这里有两个公共属性:Directory和Path,用来获取或设置像目录信息和路径,还有一个Update()私有方法,当文件路径变化时,更新最新的像文件列表数据。
3. 建立后期处理的类。
由于后期加工均涉及“印”,所以就建立一个名为“印类型”(PrintType)的类:
- // PrintType.cs
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace PhotoDemo
- {
- public class PrintType
- {
- private string _description;
- public string Description { get { return _description; } }
- private double _cost;
- public double Cost { get { return _cost; } }
- public PrintType(string description, double cost)
- {
- _description = description;
- _cost = cost;
- }
- public override string ToString()
- {
- return _description;
- }
- }
- }
这里有两个只读属性:描述Description和费用Cost,还对ToString()方法进行了重载。
#p#
4. PrintTypeList类,是PrintType列表的集合。
- // PrintTypeList .cs
- using System;
- using System.Collections.Generic;
- using System.Collections.ObjectModel;
- using System.Text;
- namespace PhotoDemo
- {
- public class PrintTypeList : ObservableCollection<PrintType>
- {
- public PrintTypeList()
- {
- Add(new PrintType("4x6 Print", 0.15));
- Add(new PrintType("Greeting Card", 1.49));
- Add(new PrintType("T-Shirt", 14.99));
- }
- }
- }
5. 建立一个PrintBase的类:
- // PrintBase.cs
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Windows.Media.Imaging;
- using System.Text;
- namespace PhotoDemo
- {
- public class PrintBase : INotifyPropertyChanged
- {
- #region public property
- private BitmapSource _photo;
- public BitmapSource Photo
- {
- set { _photo = value; OnPropertyChanged("Photo"); }
- get { return _photo; }
- }
- private PrintType _PrintType;
- public PrintType PrintType
- {
- set { _PrintType = value; OnPropertyChanged("PrintType"); }
- get { return _PrintType; }
- }
- private int _quantity;
- public int Quantity
- {
- set { _quantity = value; OnPropertyChanged("Quantity"); }
- get { return _quantity; }
- }
- #endregion public property
- public PrintBase(BitmapSource photo, PrintType printtype, int quantity)
- {
- Photo = photo;
- PrintType = printtype;
- Quantity = quantity;
- }
- public PrintBase(BitmapSource photo, string description, double cost)
- {
- Photo = photo;
- PrintType = new PrintType(description, cost);
- Quantity = 0;
- }
- public event PropertyChangedEventHandler PropertyChanged;
- private void OnPropertyChanged(String info)
- {
- if (PropertyChanged != null)
- PropertyChanged(this, new PropertyChangedEventArgs(info));
- }
- public override string ToString()
- {
- return PrintType.ToString();
- }
- }
- }
这里有三个可读写属性:Photo, PrintType和Quantity(表示片的数量),还设置了一个PropertyChanged委托,用于当属性变更时做相应的事件处理。
6. 继承自PrintBase的三个类:Print, GreetingCard, TShirt, 分别用来打印,制成贺卡及制作T恤衫。
- // Print.cs
- using System;
- using System.Collections.Generic;
- using System.Windows.Media.Imaging;
- using System.Text;
- namespace PhotoDemo
- {
- public class Print : PrintBase
- {
- public Print(BitmapSource photo) : base(photo, "4x6 Print", 0.15) { }
- }
- }
- // TShirt.cs
- using System;
- using System.Collections.Generic;
- using System.Windows.Media.Imaging;
- using System.Text;
- namespace PhotoDemo
- {
- public class TShirt : PrintBase
- {
- public TShirt(BitmapSource photo) : base(photo, "T-Shirt", 14.99) { }
- }
- }
- // GreetingCard.cs
- using System;
- using System.Collections.Generic;
- using System.Windows.Media.Imaging;
- using System.Text;
- namespace PhotoDemo
- {
- public class GreetingCard : PrintBase
- {
- public GreetingCard(BitmapSource photo) : base(photo, "Greeting Card", 1.49) { }
- }
- }
7. "印"的集合:PrintList
- // PrintList.cs
- using System;
- using System.Collections.ObjectModel;
- namespace PhotoDemo
- {
- public class PrintList : ObservableCollection<PrintBase> { }
- }
【编辑推荐】