• 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中处理方式进行,这里就不过多介绍了。

  • 相关阅读:
    如何编译Linux内核
    linux启动过程
    linux ifconfig
    Android 4.0 x86安装教程 附带联网参数详细设置
    linux ntfs模块
    Java 入门进阶
    深入理解Java中的String
    Java中字符串string的数据类型
    IDEA设置JVM运行参数
    Java11实战:模块化的 Netty RPC 服务项目
  • 原文地址:https://www.cnblogs.com/zhihai/p/2336673.html
Copyright © 2020-2023  润新知