制作一个简单的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;
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
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));
}
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
这里有两个公共属性: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;
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
这里有两个只读属性:描述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));
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
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();
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
这里有三个可读写属性: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) { }
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
7. "印"的集合:PrintList
// PrintList.cs
using System;
using System.Collections.ObjectModel;
namespace PhotoDemo
{
public class PrintList : ObservableCollection<PrintBase> { }
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
【编辑推荐】