zoukankan      html  css  js  c++  java
  • WPF中的图像处理简介

    和Winform中的GDI+相比,WPF提供了一组新的API用于显示和编辑图像。新API特点如下:

    1. 适用于新的或专用图像格式的扩展性模型。
    2. 对包括位图 (BMP)、联合图像专家组 (JPEG)、可移植网络图形 (PNG)、标记图像文件格式 (TIFF)、Microsoft Windows Media 照片、图形交换格式 (GIF) 和图标 (.ico) 在内的本机图像格式增强了性能和安全性。
    3. 高位深图像数据的保留最多 32 位/通道。
    4. 非破坏性图像缩放、裁切和旋转。
    5. 简化的颜色管理
    6. 支持文件内的专用元数据。
    7. 托管组件利用非托管基础结构提供图像与其他 WPF 功能(如用户界面 (UI)、动画和图形)的无缝集成。托管组件还可以从 Windows Presentation Foundation (WPF) 图像处理编解码器扩展性模型获益,利用该模型可以实现自动识别 WPF 中的新图像格式。

    大部分托管的 WPF 图像处理 API 驻留在 System.Windows.Media.Imaging 命名空间中,不过,几个重要的类型(如 ImageBrush 和 ImageDrawing)都驻留在 System.Windows.Media 命名空间,Image 驻留在 System.Windows.Controls 命名空间。

    下面我通过一个简单的示例演示一下新的API的使用方法:

    图像编码格式转换:

    var imageStreamSource = File.OpenRead(@"r:\1\24.bmp"); 
    var decoder = BitmapDecoder.Create(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); 
    var bitmapFrame = decoder.Frames[0];

    //在界面上显示图片 
    //image1.Source = bitmapFrame;

    var encoder = new JpegBitmapEncoder(); 
    encoder.Frames.Add(bitmapFrame); 
    encoder.Save(File.Create(@"r:\1\3.jpg"));

    这个功能非常简单,就是把一个bmp格式的图片转换为了一个jpg格式的图片。这个示例也显示了WPF的图像处理的基本方式:

    1. 从解码器(xxxDecoder)中获取图像信息 
      创建解码器后,图像信息就保存在Frames(虽然大部分图像(jpg,bmp,png等)只有一帧,但GIF,ico等图像有多帧)属性中了。
    2. 用编码器(xxxEncoder)保持图像信息 
      相应的,编码时只要创建编码器,并设置相应的帧即可。

    图像处理:

    常用的图像处理包括缩放、裁切和旋转等,如下是一个将图像旋转90度的例子。

    var imageStreamSource = File.OpenRead(@"r:\1\24.bmp"); 
    var decoder = BitmapDecoder.Create(imageStreamSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); 
    var bitmapFrame = decoder.Frames[0]; 
     

    TransformedBitmap myRotatedBitmapSource = new TransformedBitmap(); 
    myRotatedBitmapSource.BeginInit(); 
    myRotatedBitmapSource.Source = bitmapFrame; 
     

    // 旋转90 
    myRotatedBitmapSource.Transform = new RotateTransform(90); 
    myRotatedBitmapSource.EndInit(); 

    //旋转

    var rotate = new RotateTransform(90);
    var rotatedBitMap = new TransformedBitmap(bitmapFrame, rotate);

    image1.Source = rotatedBitMap;

    ////裁剪
    //CroppedBitmap chainedBitMap = new CroppedBitmap(bitmapFrame,new Int32Rect(100, 0, (int)bitmapFrame.Width - 100, (int)bitmapFrame.Height));

    ////缩放
    //var scare = new ScaleTransform(1.5, 2);
    //var scaredBitMap = new TransformedBitmap(bitmapFrame, scare);

    var encoder = new JpegBitmapEncoder();
    encoder.Frames.Add(BitmapFrame.Create(rotatedBitMap));
    //encoder.Frames.Add(BitmapFrame.Create(scaredBitMap));
    //encoder.Frames.Add(BitmapFrame.Create(chainedBitMap));
    encoder.Save(File.Create(@"r:\1\3.jpg"));

    和上面的例子相比,这里就是多了一个TransformedBitmap变换,其实这和xaml中的变换时一样的。

    <Image Width="150" Margin="5" Grid.Column="0" Grid.Row="1"> 
      <
    Image.Source
        <
    TransformedBitmap Source="/sampleImages/watermelon.jpg" > 
          <
    TransformedBitmap.Transform
            <
    RotateTransform Angle="90"/> 
          </
    TransformedBitmap.Transform
        </
    TransformedBitmap
      </
    Image.Source
    </
    Image>

    其它变换也都可以参照xaml中处理方式进行,这里就不过多介绍了。

  • 相关阅读:
    环境是如何建立的 启动文件有什么
    环境中存储的是什么
    串行 并行 异步 同步
    TPC-H is a Decision Support Benchmark
    进程通信类型 管道是Linux支持的最初Unix IPC形式之一 命名管道 匿名管道
    删除环境变量
    14.3.2.2 autocommit, Commit, and Rollback 自动提交 提交和回滚
    14.3.2.2 autocommit, Commit, and Rollback 自动提交 提交和回滚
    14.3.2.1 Transaction Isolation Levels 事务隔离级别
    14.3.2.1 Transaction Isolation Levels 事务隔离级别
  • 原文地址:https://www.cnblogs.com/zhihai/p/2336673.html
Copyright © 2011-2022 走看看