原文 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]);
}

再次运行程序:

WPF:通过BitmapSource的CopyPixels和Create方法来切割图片的更多相关文章

  1. WPF 将Bitmapsource转换到Emgu.cv.image

    原文:WPF 将Bitmapsource转换到Emgu.cv.image Transform WPF BitmapSource to Emgu.CV.Image******* /// <summ ...

  2. 分享一个TP5实现Create()方法的心得

    在TP5中发现用不了以前3.X的Create()方法,虽然用input更严谨,但是字段比较多的话还是有些不艺术的3.X中的实现方法如下: $Model = D('User'); $Model-> ...

  3. js原型链接(二)和object类的create方法

    原型链的内部执行方式 <script> function Myclass(){ this.x=" x in Myclass"; } var obj=new Myclas ...

  4. thinkphp中神奇的create()方法

    正常的表单提交会把所有的表单数据提交上来 $data = $_POST; print_r($data);exit; 结果 Array ( [status] => 1 [comment] => ...

  5. ThinkPHP第九天(在Admin分组中配置__PUBLIC__,$POST异步传输,import使用方法,验证码点击刷新方法,Create方法作用)

    1.项目分组之后,后台模板的公用文件一般放置在Tpl/Admin/Public中,这样子在替换模板路径时候如果还用__PUBLIC__时为了不与前台冲突,应该在Admin/config.php中配置一 ...

  6. zk create() 方法

    create() $path = $zkh->create($req_path, $data); $path = $zkh->create($req_path, $data, 'flags ...

  7. nova创建虚拟机源码分析系列之六 api入口create方法

    openstack 版本:Newton 注:博文图片采用了很多大牛博客图片,仅作为总结学习,非商用.该图全面的说明了nova创建虚机的过程,从逻辑的角度清晰的描述了前端请求创建虚拟机之后发生的一系列反 ...

  8. ThinkPHP中create()方法自动验证表单信息

    自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证. 原理: create()方法收集表单($_POST)信息并返回,同时触发表单自动验证 ...

  9. 解决ThinkPHP的Create方法失效而没有提示错误信息的问题

    ThinkPHP中的数据创建Create方法是一个非常有用的功能,它自动根据表单数据创建数据对象(在表字段很多的情况下尤其明显) 但有时候该方法可能并未按照你期望的来工作,比如方法不工作而且还没有提示 ...

随机推荐

  1. 从多路搜索树到 B-树

    1. 什么是 B 树 B 树是为磁盘或其他直接存取的辅助存储设备而设计的一种平衡二叉树: B 树类似于红黑树,但它们在降低磁盘 I/O 操作数方面要更好一点, 许多数据库系统使用 B 树或者 B 树的 ...

  2. 【z06】观光公交

    描述 风景迷人的小城Y市,拥有n个美丽的景点.由于慕名而来的游客越来越多,Y市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0分钟出现在1号景点,随后依次前往2.3.4--n号景 ...

  3. java完美equals方法代码段

    public boolean equals(Object otherObject) { if(this == otherObject) { // 检測this与otherObject是否引用同一个对象 ...

  4. [_UICascadingTextStorage attributesAtIndex:effectiveRange:]: Range or index out of bounds

    之前写过一篇<如何更好地限制一个UITextField的输入长度>,在文章最后得到的结论是可以直接使用 UIKIT_EXTERN NSString *const UITextFieldTe ...

  5. ITFriend创业败局(四):菜鸟CEO的自我修养

    自创业自封CEO以来,短短3个月,又经历了无数的磨练,快速成长中. 创业不同于打工,他要求你必须有全局观和综合能力,技术.市场.商务,啥都得会,还要处理各种各样的问题和矛盾. 根据个人经历,我总结了以 ...

  6. Erlang Module and Function

    Module   -module(Name). 模块是方法的集合.注意这行最后的“.”符号是必不可少的. 这个模块名必须和保存这段代码的文件(后缀为“erl”的文件)有相同的名称. 当我们在使用另一个 ...

  7. WPF动画结束后的行为方式

    原文:WPF动画结束后的行为方式 在WPF中可以使用Animation来完成动画功能,如移动,旋转等,最近写的一个程序需要实现控件的移动,包括自动移动和手动控制.原理很简单,就是改变控件的Margin ...

  8. C#中类和结构体的区别

    结构体和类同样能够定义字段,方法和构造函数,都能实例化对象,这样看来结构体和类的功能好像是一样的了,但是他们在数据的存储上是不一样的(以下摘录): C#结构体和类的区别问题:在C#编程语言中,类属于引 ...

  9. 【t096】树的序号

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 我们可以用下面的方案给二叉树标号: 空树的序号为0. 只有一个根结点的树序号为1. 所有包含m个结点的 ...

  10. sparksql jdbc数据源

    用的本地模式,pom.xml中添加了mysql驱动包,mysql已经开启,写入的时候发现用format("jdbc").save()的方式发现会有does not allow cr ...