WPF:通过BitmapSource的CopyPixels和Create方法来切割图片
原文 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方法来切割图片的更多相关文章
- WPF 将Bitmapsource转换到Emgu.cv.image
原文:WPF 将Bitmapsource转换到Emgu.cv.image Transform WPF BitmapSource to Emgu.CV.Image******* /// <summ ...
- 分享一个TP5实现Create()方法的心得
在TP5中发现用不了以前3.X的Create()方法,虽然用input更严谨,但是字段比较多的话还是有些不艺术的3.X中的实现方法如下: $Model = D('User'); $Model-> ...
- js原型链接(二)和object类的create方法
原型链的内部执行方式 <script> function Myclass(){ this.x=" x in Myclass"; } var obj=new Myclas ...
- thinkphp中神奇的create()方法
正常的表单提交会把所有的表单数据提交上来 $data = $_POST; print_r($data);exit; 结果 Array ( [status] => 1 [comment] => ...
- ThinkPHP第九天(在Admin分组中配置__PUBLIC__,$POST异步传输,import使用方法,验证码点击刷新方法,Create方法作用)
1.项目分组之后,后台模板的公用文件一般放置在Tpl/Admin/Public中,这样子在替换模板路径时候如果还用__PUBLIC__时为了不与前台冲突,应该在Admin/config.php中配置一 ...
- zk create() 方法
create() $path = $zkh->create($req_path, $data); $path = $zkh->create($req_path, $data, 'flags ...
- nova创建虚拟机源码分析系列之六 api入口create方法
openstack 版本:Newton 注:博文图片采用了很多大牛博客图片,仅作为总结学习,非商用.该图全面的说明了nova创建虚机的过程,从逻辑的角度清晰的描述了前端请求创建虚拟机之后发生的一系列反 ...
- ThinkPHP中create()方法自动验证表单信息
自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证. 原理: create()方法收集表单($_POST)信息并返回,同时触发表单自动验证 ...
- 解决ThinkPHP的Create方法失效而没有提示错误信息的问题
ThinkPHP中的数据创建Create方法是一个非常有用的功能,它自动根据表单数据创建数据对象(在表字段很多的情况下尤其明显) 但有时候该方法可能并未按照你期望的来工作,比如方法不工作而且还没有提示 ...
随机推荐
- 给自己加油,一定要学会MFC!(刚刚发现一篇文章,兼听则明: MFC,一开始就错了)
我自己对于没有学会MFC始终耿耿于怀,都什么时代了啊,但是我仍然坚持会去学MFC,因为MFC虽然落后与复杂,但是在Windows平台上仍然是无所不能的(其实Windows平台仍然是唯一可以赚钱的平台, ...
- Linux环境变量具体解释
设置环境变量 profile和bashrc文件 /etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件.此文件为系统的每一个用户设置环境信息,当用户第一次登录时,该文件被运行. 并 ...
- phpStorm怎么解决502 bad gateway(总结整理)
phpStorm怎么解决502 bad gateway(总结整理) 一.总结 1.配置 php解释器. 二.phpStorm解释器与服务器配置(解决502 bad gateway与404 not fo ...
- Android菜鸟的成长笔记(26)——普通广播与有序广播
BroadcastReceiver是Android系统的四大组件之一,BroadcastReceiver是一个全局的系统级监听器,它拥有自己的独立进程. 我们来写一个最简单的广播接收过程 先在mani ...
- Linux安装.Net core 环境并运行项目
原文:Linux安装.Net core 环境并运行项目 一 安装环境 1. 从微软官网下载 Linux版本的.NetCoreSdk 2.0 安装包 打开终端: 第一步: sudo yum insta ...
- 编译器是C写的,包括一点C++,editor和debugger是C++写的(最早的16位编译器是纯汇编写的)
16bit compiler was written in pure assembler. The current compiler is written in C. It was derived f ...
- 【u204】高级砝码称重
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 现有n个砝码,重量分别为a1,a2,a3,--,an,在去掉m个砝码后,问最多能称量出多少不同的重量( ...
- KVM,QEMU核心分析
现在的问题是学习虚拟化软件KVM相关实施原则.处理,的源代码的分析总结,,若有不对的地方,希望大家提出. 因为有一些代码结构图或者是架构图上传比較麻烦.所以博文都放在了自己的个人博客上.麻烦大家移步查 ...
- mysql半同步复制实现
mysql半同步复制和异步复制的区别如上述架构图所看到的:在mysql异步复制的情况下.Mysql Master Server将自己的Binary Log通过复制线程传输出去以后,Mysql Mast ...
- cordova打包之android应用签名
原文:cordova打包之android应用签名 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/mate_ge/article/details/78 ...