WPF:通过BitmapSource的CopyPixels和Create方法来切割图片
2024-09-03 04:35:45
原文 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]);
}
再次运行程序:
最新文章
- 大叔最新课程~EF核心技术剖析
- swift 动手写网络请求封装(仿照了一个大神的)不用导入第三方
- 【数据结构】book3_3 表达式求值
- POJ 2892 Tunnel Warfare(线段树单点更新区间合并)
- Android源码剖析之Framework层实战版(Ams管理Activity启动)
- ubuntu安装python3
- ubuntu 11.10 (64bit) install opencv 2.4.8 and run in Qtcreator
- TD(TestDirector 8.0)在win7 ie8下无法用的解决方案:
- 常用的MAVEN公共私服
- setInterval()、clearInterval()、setTimeout()和clearTimeout()js计数器方法
- PTF在PET上印刷線路的注意事項
- 使用Fiddler改变线上js文件的引用路径
- How to view the DNS address assigned by DHCP
- java 约束配置文件和本地约束
- python约束 异常 MD5 日志处理
- C++中内存泄漏的几种情况
- 〖Linux〗Shell脚本修改输出文字颜色
- iOS彩票项目--第四天,新特性界面搭建,UICollectionViewController的初次使用
- 【vue】父向子组件传参、子组件向父传参
- iBeacon的第一篇(基于Swift实现)
热门文章
- Android-通过Java代码来实现属性动画
- SignalR+NAudio实现语音会话[WPF]
- Swift 中的高阶函数和函数嵌套
- WPF动态创建Image的显示问题
- jQuery迭代器
- 一言不合就写socket的post和get请求(拼内容,然后发出去即可)
- [Unity3D]Unity3D游戏开发Lua随着游戏的债券(在)
- C#中HttpWebRequest与HttpWebResponse的使用方法
- delphi的bpl、dcp 、dcu文件意义(BPL相当于C++中的DLL,DCP相当于C++中的Lib,编译时需要)
- Java和Flex积分误差(两)