zoukankan      html  css  js  c++  java
  • 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 }


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

  • 相关阅读:
    element ui 表单清空
    element ui 覆盖样式 方法
    element ui 修改表单值 提交无效
    element ui 抽屉里的表单输入框无法修改值
    element ui 抽屉首次显示 闪烁
    css 左侧高度 跟随右侧内容高度 自适应
    PICNUF框架
    elementui 抽屉组件标题 出现黑色边框
    vue 子组件跨多层调用父组件中方法
    vue 编辑table 数据 未点击提交,table里的数据就发生了改变(深拷贝处理)
  • 原文地址:https://www.cnblogs.com/GhostZCH/p/2437693.html
Copyright © 2011-2022 走看看