• WPF下的简单数字图像处理


    BitmapSource 是WPF中图片的核心类型,读、写、显示都很常用,下面所有的操作都是以这个类型为核心的。

    从文件读如图片到BitmapSource 类型:

     1 private BitmapSource GetSource() 
    2 {
    3   BitmapSource result = null;
    4
    5   OpenFileDialog dialog = new OpenFileDialog();
    6   dialog.Filter = "常用位图(*.bmp;*.jpg;*.png)|*.bmp;*.jpg;*.png";
    7
    8   if (true == dialog.ShowDialog() && File.Exists(dialog.FileName))
    9   {
    10     FileStream imageStreamSource = File.OpenRead(dialog.FileName);
    11     BitmapDecoder decoder = BitmapDecoder.Create(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default);
    12     result = decoder.Frames[0];
    13   }
    14
    15   return result;
    16 }

    写文件:

     1 private void OutPut_Click(object sender, RoutedEventArgs e) 
    2 {
    3
    4   SaveFileDialog dialog = new SaveFileDialog();
    5   dialog.Filter = "图片(*.jpg)|*.jpg";
    6   dialog.FileName = Title;
    7   dialog.Title = "保存图片";
    8
    9   if (dialog.ShowDialog() == true)
    10   {
    11     // 利用JpegBitmapEncoder,对图像进行编码,以便进行保存
    12     JpegBitmapEncoder encoder = new JpegBitmapEncoder();
    13     encoder.Frames.Add(BitmapFrame.Create(_image));
    14     // 保存文件
    15     FileStream fileStream = new FileStream(dialog.FileName, FileMode.Create, FileAccess.ReadWrite);
    16     encoder.Save(fileStream);
    17     // 关闭文件流
    18     fileStream.Close();
    19
    20     MessageBox.Show("保存成功!");
    21   }
    22 }

    显示:

       1. Image 控件的 Source 属性设置即可

       2. 其他控件的背景设置:this.Background = new ImageBrush(image);//image 是  BitmapSource  类型

    处理:

     这里奉上一个类,还有些问题,欢迎拍砖

        /// <summary>
    /// 像素图像
    /// </summary>
    public class ByteImage
    {
    #region 字段

    byte[] _pixls;
    int _height;
    int _width;
    int _stride;
    int _bytePerPixel;
    double _dpix;
    double _dpiy;
    PixelFormat _format;
    BitmapPalette _palette;

    #endregion


    #region 访问器

    public PixelFormat Format
    {
    get { return _format; }
    set { _format = value; }
    }

    public double Dpiy
    {
    get { return _dpiy; }
    set { _dpiy = value; }
    }

    public double Dpix
    {
    get { return _dpix; }
    set { _dpix = value; }
    }

    public BitmapPalette Palette
    {
    get { return _palette; }
    set { _palette = value; }
    }

    public int Height
    {
    get { return _height; }
    }

    public int Width
    {
    get { return _width; }
    }

    public int Stride
    {
    get { return _stride; }
    }

    public byte[] Pixels
    {
    get { return _pixls; }
    set { _pixls = value; }
    }

    public int BytePerPixel
    {
    get { return _bytePerPixel; }
    }

    #endregion


    #region 函数

    /// <summary>
    /// 像素图像
    /// </summary>
        public ByteImage(BitmapSource image)
    {
    _width = image.PixelWidth;
    _height = image.PixelHeight;
    _bytePerPixel = image.Format.BitsPerPixel / 8;
    _stride = _width * _bytePerPixel;//跨距 图片的一行
           _pixls = new byte[_stride * _height];
    _dpix = image.DpiX;
    _dpiy = image.DpiY;
    _format = image.Format;
    _palette = null;
    image.CopyPixels(_pixls, _stride, 0);
    }

    /// <summary>
    /// 获得一个像素的颜色信息 超界返回 nul
    /// </summary>
    /// <param name="x">X</param>
    /// <param name="y">Y</param>
    /// <returns>颜色信息 byte[]</returns>
        public byte[] GetPixel(int x, int y)
    {
    byte[] pixel = null;

    if (x < Height && y < Width && x >= 0 && y >= 0)
    {
    int startPostion = Stride * x + y * BytePerPixel;

    pixel = new byte[BytePerPixel];

    for (int i = 0; i < BytePerPixel; i++)
    {
    pixel[i] = Pixels[startPostion + i];
    }
    }

    return pixel;
    }

    /// <summary>
    /// 设置一个像素的颜色信息
    /// </summary>
    /// <param name="pixel">颜色信息</param>
    /// <param name="x">X</param>
    /// <param name="y">Y</param>
         public void SetPixel(byte[] pixel, int x, int y)
    {
    int startPostion = Stride * x + y * BytePerPixel;

    if (x < Height && y < Width && x >= 0 && y >= 0 && pixel.Length == BytePerPixel)
    {
    for (int i = 0; i < BytePerPixel; i++)
    {
    Pixels[startPostion + i] = pixel[i];
    }
    }
    }


    /// <summary>
    /// 转换成位图
    /// </summary>
    /// <param name="dpix">水平DPI</param>
    /// <param name="dpiy">垂直DPI</param>
    /// <param name="format">格式</param>
    /// <param name="palette">调色板</param>
    /// <returns></returns>
        public BitmapSource ToBitmapSource(double dpix, double dpiy, PixelFormat format, BitmapPalette palette = null)
    {
    return BitmapSource.Create(Width, Height, dpix, dpiy, format, palette, Pixels, Stride);
    }

    /// <summary>
    /// 转换成位图
    /// </summary>
         public BitmapSource ToBitmapSource()
    {
    return BitmapSource.Create(Width, Height, _dpix,_dpiy, _format, _palette, Pixels, Stride);
    }

    #endregion
    }


    这个类通过一个 BitmapSource构造 并可以输出成 BitmapSource 类型。它的主要作用是架起在 BitmapSource与byte[] 之间的桥梁,在两者之间进行转换,并提供按照矩阵方式设置或读取一个像素点的方法,为后续基于像素的处理提供方便。 

    灰化:

    1 private BitmapSource ToGray(BitmapSource source) 
    2 {
    3 FormatConvertedBitmap re = new FormatConvertedBitmap();
    4 re.BeginInit();
    5 re.Source = source;
    6 re.DestinationFormat = PixelFormats.Gray8;
    7 re.EndInit();
    8 return re;
    9 }


    祝各位,学习进步,工作愉快,身体健康!

  • 相关阅读:
    Java 类加载、调用构造器、执行方法的过程
    flink定义各类source
    flink个人基础笔记
    flink任务提交流程
    Flink 命令
    Flink开发环境搭建(idea2019)
    Flink集群部署
    canal开启状态,但是不能生产数据到kafka,问题解决
    Cannal单节点部署
    kafka单节点部署
  • 原文地址:https://www.cnblogs.com/GhostZCH/p/2437693.html
Copyright © 2020-2023  润新知