- 博客(124)
- 收藏
- 关注
原创 winform 绘制图像慢?如何解决?超高性能优化
场景:我们有时候获取相机的图像,需要将这个图像绘制在winform控件或窗体上,大都人的做法是将这个相机扔过来的指针转Bitmap对象,然后直接赋值给PictureBox.Image属性,获取将这个Bitmap对象绘制到控件的Graphics上,他们有个相同点,就是性能很低,再加上处理的算法或者在Graphics上绘制ROI、文字等,速度就更慢了。这里的测试图像是2592×1944≈500万像素。使用上,直接在Paint事件上调用即可。大概在1~3ms内波动。
2025-03-18 14:02:58
98
原创 C# 项目无法加载 DLL“SQLite.Interop.DLL”: 找不到指定的模块
明显的告诉我们这些是必须的。所以我们只需要下载安装就行,由于项目是.net framework4.0,windows系统自带,所以不需要安装(有也不需要安装,高于此版本得需要安装),我们只需要安装。4. 滚动条拉到下面,找到对应项目框架的版本,比如我这里是.net framework4.0 并且是64位的。从上面不难看出它需要这些依赖环境,5.如下下载Visual C++1.进入sqlite官网首页。
2024-12-19 11:23:37
1003
原创 C#/WinForm拖拽文件上传
发现使用Region属性有锯齿,尽管开启高质量绘图也无用,我们去掉Region属性,但是新的问题出现,此控件的背景必须和父级窗体的背景一致,不然圆角效果就没有了。后续我们都是不设置Region属性,保持背景与父级控件背景一致就行。五、我们定义一个枚举,用来实现鼠标移、出移入、点击、文件拖动让边框变色。三、重写OnPaint事件,绘制填充圆角背景。四、在OnPaint事件,绘制上传图像以及文字。四、在OnPaint事件,绘制圆角边框。六、实现文件拖动上传。
2024-11-15 09:13:33
973
原创 C#/WinForm 基于ffmpeg视频流转GIF
源码:https://gitee.com/feng-cai/screenshot-recording。
2024-10-30 23:51:37
282
原创 C#/WinForm 基于ffmpeg视频录制
git地址:https://gitee.com/feng-cai/screenshot-recording。录制的视频、截图都在根目录下。具体实现代码见源码。
2024-10-30 22:00:13
379
原创 C#/WinForm 鼠标穿透自定义区域截图(后续实现录屏)
git地址:https://gitee.com/feng-cai/screenshot-recording。
2024-10-30 14:03:07
380
原创 C# 图像镜像
simd指令解释:垂直镜像直接交换两个向量的元素即可,但是水平镜像不行,在交换位置前需要对向量内部元素进行位置颠倒,Avx2.Shuffle对32位向量低位和高位分开进行颠倒,所以我们需要使用Avx2.Permute2x128指令颠倒低位和高位。图像镜像是图像旋转变换的一种特殊情况,通常包括垂直方向和水平方向的镜像。水平镜像通常是以原图像的垂直中轴为中心,将图像分为左右两部分进行堆成变换。垂直镜像通常是以原图像的水平中轴线为中心,将图像划分为上下两部分进行堆成变换的过程。耗时3ms,性能再次提升!
2024-10-09 09:55:19
625
原创 C# 图像平移
图像平移:图像的平移是将一幅图像上的所有点都按照给定的偏移量在水平方向沿x轴、在垂直方向上沿y轴移动,平移后的图像与原图像大小相同。上面代码种tempArray数组用Array.Fill方法初始化默认值,因为图像背景为黑色,为了方便区分,设置为白色,以就是:Array.Fill(tempArray, byte.MaxValue);本次实验图像用的时500w像素的图像(2592×1944),且深度为8。接下来我们做算法优化,优化方向:减少重复计算和边界处理。优化非常有效,性能嘎嘎猛!
2024-10-08 16:49:57
394
原创 C# 利用simd比较两个文件是否相等(高性能)
Avx2.MoveMask如果Vector256向量全为为非0且所有元素相等,返回-1,全为0返回0,其它返回其它整数。Avx2.CompareEqual,比较两个Vector256向量,如果元素相同返回255,否则返回0。主要用到两个指令集,CompareEqual指令与MoveMask指令,因为电脑cpu原因,我们采用Avx2。测试:1GB的两个文件对比只需要1ms。
2024-09-26 22:00:16
323
原创 退火吗?C#/WinForm演示退火算法
算法开始时,初始温度设置得较高,允许算法在大范围内随机搜索解空间,以跳出局部最优解。随着温度逐渐降低,搜索过程变得越来越局部化,最终在低温下稳定在某个解附近,这个解通常是全局最优解或近似全局最优解。退火过程:假设定义域内随机点x0,相当于一个粒子,它会进行无序运动,也就是向左或者向右移动,移动幅度与和当前温度T有关,温度T越大,移动幅度越大,温度T越小,移动幅度就越小。如上图,起始点x0,那么x=x0,下一个随机点是x1,如果求最大值,fx1>fx0,此时需要更新状态,x=x1,y=fx1。
2024-09-04 09:54:48
588
原创 C# 不一样的洗牌算法---Simd指令
Shuffle指令:用于根据提供的控制值(control)重新排列 Vector128 类型向量中的元素。(比如洗牌算法打乱数组中元素的位置)。Store指令:将向量的数据存储到内存地址。洗牌算法,以随机打乱数组中元素的位置。普通打乱数组元素位置。
2024-08-15 15:27:58
394
原创 C# simd指令之MaskMove
掩码中的每个元素(sbyte)将决定相应位置的元素是否被写入内存。如果掩码中的元素为非零值,则对应的元素将被写入;如果为零,则不写入。该方法将掩码向量中的每个非零元素对应的源向量中的元素移动到内存地址指定的位置。如果掩码中的元素为零,则对应的内存位置不会被修改。将source向量中的元素全部移到tmpData数组中,这样我们将向量拷贝到数组中的时候就可以用到了。如果需要source指定位置的元素不移动,只需要在mask 指定位置的元素设置为0。也可以把向量复制移动到另外的向量,我们就可以实现向量深拷贝。
2024-08-14 20:23:43
431
原创 Winform 连续单击触发双击事件
通过上面user32中的SetDoubleClickTime方法,设置就行,比如200。Winform 连续单击触发双击事件,如何减小双击时间的判断间隔。
2024-06-25 16:35:45
220
原创 C# 使用Vector256写了一个简单的帮助类Vector256Helper
当数据量大的时候用普通代码计算非常耗时,这里简单利用simd加速处理。
2024-06-21 17:15:27
474
1
原创 C# 数字字符串排序
例如:string[] strings = { "D10", "D2", "D1","D0", "D3", "D9" };升序后:strings = { "D0", "D1", "D2","D3", "D9", "D10" };使用:Array.Sort(strings, new SemiNumericComparer());以上两个方法都可以实现数字字符串排序,如果数据量大推荐方法二。方法二:自定义比较器。
2024-05-28 16:33:20
986
Winform基于FlaUI实现微信自动化
2024-01-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人