原文 WPF:通过BitmapSource的CopyPixels和Create方法来切割图片

BitmapSource是WPF图像的最基本类型,它同时提供两个像素相关的方法就是CopyPixels和Create方法。使用这两个方法可以切割图片中的一部分,类似另一个BitmapSource的子类:CroppedBitmap类型。

CopyPixels方法需要提前初始化数组,同时还可以指定一个矩形(Int32Rect类型)来表示所占区域的大小。计算好图像每行所占字节数(Stride参数)和偏移量(Offset参数,通常是0)就可以正确调用CopyPixels了。接着使用填充后的数组,调用Create方法,另一个被切割的部分图像对象就生成了。

切割矩形的值代表图像像素的位置,比如一个200*200像素的图像,我们要四分之一部分的右上角,那么矩形的定义就是:new Int32Rect(100, 0, 100, 100);

在界面上定义两个Image控件:img1和img2

<UniformGrid Rows="1">
<Image Name="img1"/>
<Image Name="img2"/>
</UniformGrid>

背后操作代码,首先读取文件并显示在img1中:

//图像路径
var path = @"E:\Users\Mgen\Pictures\mgenx.jpg";
//创建BitmapSource
BitmapSource bitmap = new BitmapImage(new Uri(path, UriKind.Absolute));
//把原图像显示在img1中
img1.Source = bitmap;

接下来通过CopyPixels把部分图像数据拷贝到数组中:

//定义切割矩形
var cut = new Int32Rect(100, 0, 100, 100);
//计算Stride
var stride = bitmap.Format.BitsPerPixel * cut.Width / 8;
//声明字节数组
byte[] data = new byte[cut.Height * stride];
//调用CopyPixels
bitmap.CopyPixels(cut, data, stride, 0);

最后通过BitmapSource.Create创建BitmapSource,并显示到img2控件中:

img2.Source = BitmapSource.Create(100, 100, 0, 0, PixelFormats.Bgr32, null, data, stride);

结果,左为原图,右为四分之一的右上角:

当然,CopyPixels填充的数组可以任意处理,比如做反色处理:

for (int i = 0; i < data.Length; i++)
{
data[i] = (byte)(Byte.MaxValue - data[i]);
}

再次运行程序:

最新文章

  1. 大叔最新课程~EF核心技术剖析
  2. swift 动手写网络请求封装(仿照了一个大神的)不用导入第三方
  3. 【数据结构】book3_3 表达式求值
  4. POJ 2892 Tunnel Warfare(线段树单点更新区间合并)
  5. Android源码剖析之Framework层实战版(Ams管理Activity启动)
  6. ubuntu安装python3
  7. ubuntu 11.10 (64bit) install opencv 2.4.8 and run in Qtcreator
  8. TD(TestDirector 8.0)在win7 ie8下无法用的解决方案:
  9. 常用的MAVEN公共私服
  10. setInterval()、clearInterval()、setTimeout()和clearTimeout()js计数器方法
  11. PTF在PET上印刷線路的注意事項
  12. 使用Fiddler改变线上js文件的引用路径
  13. How to view the DNS address assigned by DHCP
  14. java 约束配置文件和本地约束
  15. python约束 异常 MD5 日志处理
  16. C++中内存泄漏的几种情况
  17. 〖Linux〗Shell脚本修改输出文字颜色
  18. iOS彩票项目--第四天,新特性界面搭建,UICollectionViewController的初次使用
  19. 【vue】父向子组件传参、子组件向父传参
  20. iBeacon的第一篇(基于Swift实现)

热门文章

  1. Android-通过Java代码来实现属性动画
  2. SignalR+NAudio实现语音会话[WPF]
  3. Swift 中的高阶函数和函数嵌套
  4. WPF动态创建Image的显示问题
  5. jQuery迭代器
  6. 一言不合就写socket的post和get请求(拼内容,然后发出去即可)
  7. [Unity3D]Unity3D游戏开发Lua随着游戏的债券(在)
  8. C#中HttpWebRequest与HttpWebResponse的使用方法
  9. delphi的bpl、dcp 、dcu文件意义(BPL相当于C++中的DLL,DCP相当于C++中的Lib,编译时需要)
  10. Java和Flex积分误差(两)