欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » ASP.Net » 正文

热门阅读

教你制作一个简单的WPF图片浏览器(1)

创建时间:2011年06月12日 23:39  阅读次数:(6420)
分享到:

制作一个简单的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()方法进行了重载。

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> { }
}
来源:
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 13+52=? 的结果(结果是:65)
结  果: