原文 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/S系统的前台和后台数据转递机制探究

    作者:朱金灿 来源:http://blog.csdn.net/clever101 说实话写这篇文章超出了我的能力范围之外(因为我并没有多少Web开发经验),我所期待的是能起一个抛砖引玉的作用--希望高 ...

  2. CSDN code使用教程之git使用方法具体解释

          首先须要下载GITclient.http://git-scm.com/downloads. . . 然后再code.csdn.net上面创建一个项目,假设 你的项目已经存在.那么请建立项目 ...

  3. Python 数组[],元组(),字典{}的异同

    序列 Python有6中内建的序列,在这里我们重点讨论两种,数组和元组.所有序列都可以做某些特定的操作,大致上常用的是:加,乘,索引,分片以及检查某个元素是否属于序列的成员. Python还提供一些内 ...

  4. Erlang游戏开发-协议

    Erlang游戏开发-协议 选择什么协议? 协议包含通讯协议和数据格式. 通讯协议 通讯协议目前常用的是:HTTP 和TCP .其有各自的特点根据游戏的特点而进行选择. HTTP HTTP比较成熟,使 ...

  5. matplotlib油漆基础

    http://blog.csdn.net/pipisorry/article/details/37742423 matplotlib介绍 matplotlib 是python最著名的画图库,它提供了一 ...

  6. hbase 2.0.2 分布式安装配置/jar包替换

    环境 zk: 3.4.10 hadoop 2.7.7 jdk8 hbase 2.0.2 三台已安装配置好的hadoop002,hadoop003,hadoop004 1.上传并解压hbase-2.1. ...

  7. spring集成Quartz时区问题造成任务晚执行八小时

    项目中在Spring中集成了Quartz,配置的每日凌晨执行的定时任务都是到了八点多才执行,经过一番查找,可能是时区问题造成的. 一种解决办法是在JVM启动参数中增加 --Duser.timezone ...

  8. Troubleshooting routing topology based on a reference topology

    In one embodiment, a computing device (e.g., border router or network management server) transmits a ...

  9. [Servlet]Servlet工作流程及注意事项

    Servlet工作过程 采用Servlet完成Web实际的工作流应用程序是通过Tomcatserver公布服务,client与server遵循的端部之间的相互作用Http议完毕的. 详细工作流程例如以 ...

  10. xshell登陆Win10 Linux子系统

    原文:xshell登陆Win10 Linux子系统 版权声明:转载请注明出处 https://blog.csdn.net/anychenp/article/details/78922320 修改端口 ...