WPF中的图像处理简介
2015-07-12 17:54
513 查看
和Winform中的GDI+相比,WPF提供了一组新的API用于显示和编辑图像。新API特点如下:
适用于新的或专用图像格式的扩展性模型。
对包括位图 (BMP)、联合图像专家组 (JPEG)、可移植网络图形 (PNG)、标记图像文件格式 (TIFF)、Microsoft Windows Media 照片、图形交换格式 (GIF) 和图标 (.ico) 在内的本机图像格式增强了性能和安全性。
高位深图像数据的保留最多 32 位/通道。
非破坏性图像缩放、裁切和旋转。
简化的颜色管理
支持文件内的专用元数据。
托管组件利用非托管基础结构提供图像与其他 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的图像处理的基本方式:
从解码器(xxxDecoder)中获取图像信息
创建解码器后,图像信息就保存在Frames(虽然大部分图像(jpg,bmp,png等)只有一帧,但GIF,ico等图像有多帧)属性中了。
用编码器(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 rot
4000
atedBitMap = 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中处理方式进行,这里就不过多介绍了。
适用于新的或专用图像格式的扩展性模型。
对包括位图 (BMP)、联合图像专家组 (JPEG)、可移植网络图形 (PNG)、标记图像文件格式 (TIFF)、Microsoft Windows Media 照片、图形交换格式 (GIF) 和图标 (.ico) 在内的本机图像格式增强了性能和安全性。
高位深图像数据的保留最多 32 位/通道。
非破坏性图像缩放、裁切和旋转。
简化的颜色管理
支持文件内的专用元数据。
托管组件利用非托管基础结构提供图像与其他 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的图像处理的基本方式:
从解码器(xxxDecoder)中获取图像信息
创建解码器后,图像信息就保存在Frames(虽然大部分图像(jpg,bmp,png等)只有一帧,但GIF,ico等图像有多帧)属性中了。
用编码器(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 rot
4000
atedBitMap = 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中处理方式进行,这里就不过多介绍了。
相关文章推荐
- aspectJ切面使用
- JAVA 接口 抽象类 的区别
- linux配置SSH连接
- Jetty:开发指导Handlers
- Unity3D开发(一):NGUI Sprite效果变灰(按钮禁用状态)的解决方案
- 关于spring+springMVC+myBatis的一些基础配置以及整合
- 结构-06. 复数四则运算
- Samung Galaxy III I535 黑砖救活经过
- 高效的oracle模糊查询SQL
- iOS --- 去掉UITableView中的空白行
- 数据结构与算法之二叉搜索树
- 读取kafka 0.8 简单例子
- 文章标题
- 进程中多线程共享变量
- Unity3D之空间转换学习笔记(一):场景物体变换
- Java 自定义注解释义
- IOS 枚举类型
- 新手入门如何系统地学习数据挖掘
- SSH框架搭建及配置文件
- JSP中EL表达式入门与简介