C#图像批量处理实战(System.Drawing性能优化全曝光)

第一章:C# 图形处理:System.Drawing 进阶

图像绘制与GDI+核心对象

在 .NET Framework 和 .NET Core/5+ 的图形处理中,System.Drawing 提供了基于 GDI+ 的强大绘图能力。核心类包括 Graphics、Pen、Brush 和 Image,它们共同支撑二维图形的创建与操作。 使用 Graphics 对象可在位图或控件表面进行绘制。以下示例展示如何创建一个 200x200 像素的位图,并在其上绘制红色矩形和蓝色文字:
// 创建位图并获取绘图表面
using (Bitmap bitmap = new Bitmap(200, 200))
using (Graphics g = Graphics.FromImage(bitmap))
using (Pen redPen = new Pen(Color.Red, 2))
using (SolidBrush blueBrush = new SolidBrush(Color.Blue))
{
    // 绘制矩形边框
    g.DrawRectangle(redPen, 10, 10, 180, 100);
    
    // 绘制字符串
    g.DrawString("Hello GDI+", new Font("Arial", 14), blueBrush, new PointF(20, 130));
    
    // 保存图像到文件
    bitmap.Save("output.png", System.Drawing.Imaging.ImageFormat.Png);
}

常用图像格式与性能考量

不同图像格式适用于不同场景。以下为常见格式对比:
格式压缩类型透明支持典型用途
PNG无损是图标、UI资源
JPEG有损否照片、网络图片
BMP无压缩部分支持临时处理、兼容性需求
  • 避免在高并发服务中频繁创建 Graphics 对象,因其封装非托管资源
  • 务必使用 using 语句确保资源及时释放
  • 在 ASP.NET 等 Web 场景中,建议将图像生成任务异步化或交由专用服务处理
graph TD A[开始图像处理] --> B{加载原始图像} B --> C[创建Graphics对象] C --> D[执行绘图操作] D --> E[保存或输出结果] E --> F[释放资源]

第二章:System.Drawing 核心原理与性能瓶颈分析

2.1 GDI+底层机制与图像对象生命周期管理

GDI+作为Windows图形设备接口的增强版本,依赖于用户模式下的`gdiplus.dll`与内核模式驱动协同工作。其核心通过句柄表管理绘图资源,每个图像对象(如Bitmap、Graphics)均对应非托管内存中的GDI对象。
图像对象的创建与销毁流程
在.NET中使用GDI+时,必须显式释放非托管资源。例如:

using (Bitmap bitmap = new Bitmap(800, 600))
using (Graphics g = Graphics.FromImage(bitmap))
{
    g.Clear(Color.White);
    // 绘制操作...
} // 自动调用Dispose释放资源
上述代码中,using语句确保Dispose()被调用,防止句柄泄漏。Bitmap封装了DIB节句柄,Graphics关联设备上下文(HDC),二者均需及时释放。
资源管理关键点
  • 避免跨线程访问同一图像对象,GDI+非线程安全
  • 频繁创建/销毁图像时应考虑对象池优化
  • Dispose后禁止再次使用对象,否则引发ObjectDisposedException

2.2 内存泄漏常见场景及Dispose模式最佳实践

在.NET开发中,未正确释放非托管资源是导致内存泄漏的常见原因,尤其在处理文件流、数据库连接或GDI+对象时尤为突出。
典型内存泄漏场景
  • 使用 FileStream 后未调用 Close() 或 Dispose()
  • 事件订阅未取消,导致对象无法被GC回收
  • 静态集合持有对象引用过长生命周期
Dispose模式标准实现
public class ResourceHolder : IDisposable
{
    private IntPtr handle;
    private bool disposed = false;

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (disposed) return;
        if (disposing) {
            // 释放托管资源
        }
        // 释放非托管资源
        handle = IntPtr.Zero;
        disposed = true;
    }
}
上述代码通过双阶段释放机制确保资源安全释放:首先由开发者显式调用 Dispose(),内部调用受保护的虚方法处理资源清理,并标记已释放状态,防止重复释放。

2.3 位图操作中的锁定位技术与内存访问优化

在高并发场景下,位图(Bitmap)常用于高效表示海量布尔状态。为避免多线程竞争导致数据不一致,**锁定位技术**通过原子操作保护特定位的读写。
原子操作实现位锁定
利用CPU提供的原子指令(如x86的`LOCK`前缀指令),可对特定bit进行原子性测试与设置:
uint32_t* bitmap = ...; // 共享位图
int bit_index = 10;

// 原子地测试并置位
bool was_set = __atomic_test_and_set(&bitmap[bit_index / 32], __ATOMIC_ACQ_REL);
if (!was_set) {
    // 成功获取该位的独占访问权
}
上述代码通过`__atomic_test_and_set`确保对目标字的访问是互斥的,避免了显式加锁开销。
内存访问局部性优化
  • 将频繁访问的位图区域集中存储,提升缓存命中率
  • 采用分块位图(chunked bitmap),每块独立加锁,降低锁粒度
  • 使用内存映射文件支持超大位图的高效I/O

2.4 多线程环境下Graphics对象的安全使用策略

在多线程图形渲染场景中,Graphics对象通常不具备线程安全性,直接跨线程访问可能导致资源竞争或绘制异常。
数据同步机制
通过锁机制保护共享的图形资源是常见做法。例如,在Java中可使用synchronized关键字确保同一时间只有一个线程操作Graphics2D实例:

synchronized (graphics) {
    graphics.setColor(Color.RED);
    graphics.fillRect(x, y, width, height);
}
上述代码通过同步块限制对graphics对象的并发访问,避免多个线程同时修改绘图状态导致画面错乱。参数x, y, width, height定义了矩形区域,而颜色设置与填充操作需原子执行。
线程隔离策略
更优方案是采用线程局部存储(Thread Local)为每个线程分配独立的渲染上下文,减少锁争用,提升绘制效率。

2.5 性能剖析:从DrawImage到Save的耗时溯源

在图像处理流水线中,DrawImage 到 Save 的链路常成为性能瓶颈。通过精细化埋点发现,主要耗时集中在像素数据复制与编码阶段。
关键路径耗时分布
  • DrawImage调用:涉及GPU纹理上传,受图像尺寸影响显著
  • 像素读取(GetPixels):同步阻塞主线程,大图场景尤为明显
  • 编码压缩(Save):JPEG/PNG编码器CPU占用高,压缩率影响耗时
典型代码片段与优化建议
ctx.DrawImage(img, 0, 0)
pixels := ctx.GetImageData(0, 0, w, h) // 同步操作,建议降采样
err := canvas.Save("output.jpg", "image/jpeg", 0.8) // 质量参数权衡
上述GetImageData为同步调用,可结合WebWorker或分块处理降低单次负载;Save操作中质量参数0.8可在视觉与性能间取得平衡。

第三章:批量图像处理关键技术实现

3.1 高效遍历与并行化加载大量图像文件

在处理大规模图像数据集时,传统串行遍历方式效率低下。采用并发策略可显著提升文件扫描与加载速度。
递归遍历优化
使用 filepath.Walk 可高效遍历深层目录结构:
filepath.Walk(rootDir, func(path string, info os.FileInfo, err error) error {
    if strings.HasSuffix(strings.ToLower(info.Name()), ".jpg") {
        imageFiles = append(imageFiles, path)
    }
    return nil
})
该方法避免重复 stat 系统调用,减少 I/O 开销。
并行加载实现
通过 Goroutine 池控制并发数,防止资源耗尽:
  • 使用 sync.WaitGroup 协调协程生命周期
  • 结合缓冲 channel 限制最大并发连接数
性能对比
方式10,000 图像耗时
串行加载218s
并行(10 worker)47s
合理并发使加载效率提升近 4.6 倍。

3.2 图像缩放、裁剪与水印添加的高性能封装

在高并发图像处理场景中,需对图像操作进行统一抽象与性能优化。通过构建无状态处理管道,将缩放、裁剪与水印功能封装为可组合模块,显著提升复用性与执行效率。
核心处理流程
图像处理链路包含三个关键阶段:预处理(格式检测)、变换(尺寸调整)、后处理(水印叠加)。每个阶段独立运行,便于并行优化。
代码实现示例

// ImageProcessor 高性能图像处理器
type ImageProcessor struct {
    Resize   *ResizeConfig
    Crop     *CropConfig  
    Watermark *WatermarkConfig
}

func (p *ImageProcessor) Process(src []byte) ([]byte, error) {
    img, _ := decode(src)
    if p.Resize != nil {
        img = resize(img, p.Resize.Width, p.Resize.Height)
    }
    if p.Crop != nil {
        img = crop(img, p.Crop.X, p.Crop.Y, p.Crop.W, p.Crop.H)
    }
    if p.Watermark != nil {
        img = overlayWatermark(img, p.Watermark.Image, p.Watermark.Pos)
    }
    return encodeJPEG(img, 80), nil
}
上述代码定义了一个链式图像处理器,各配置项可选。resize 使用双线性插值算法,crop 采用 ROI(Region of Interest)裁剪,watermark 支持透明度叠加,整体耗时控制在毫秒级。
性能对比数据
操作类型平均耗时(ms)内存占用(MB)
仅缩放158.2
缩放+裁剪189.1
全功能处理2310.5

3.3 利用缓冲池减少频繁创建Bitmap开销

在高频图像处理场景中,频繁创建和销毁 Bitmap 对象会显著增加内存分配压力与GC频率。通过引入对象缓冲池(Object Pool),可有效复用已创建的 Bitmap 实例,降低系统开销。
缓冲池核心设计
使用 sync.Pool 维护空闲 Bitmap 对象,获取时优先从池中取用,避免重复分配:
var bitmapPool = sync.Pool{
    New: func() interface{} {
        return newBitmap(1024, 768) // 预设尺寸
    },
}

func GetBitmap() *Bitmap {
    return bitmapPool.Get().(*Bitmap)
}

func PutBitmap(b *Bitmap) {
    b.Reset() // 清理状态
    bitmapPool.Put(b)
}
上述代码中,New 函数定义了默认构造方式;Get 和 Put 分别用于获取与归还实例。关键在于归还前调用 Reset() 重置像素数据,防止脏读。
性能对比
策略平均分配次数GC暂停时间
直接新建1200次/s18ms
启用缓冲池80次/s3ms

第四章:实战中的系统级优化方案

4.1 使用对象池复用Graphics和Bitmap实例

在高性能图形处理场景中,频繁创建和销毁 Graphics 与 Bitmap 对象会带来显著的 GC 压力。通过对象池模式复用实例,可有效降低内存分配频率。
对象池基本结构
使用 ConcurrentStack 实现线程安全的对象缓存:
private static readonly ConcurrentStack<Bitmap> _bitmapPool = new();
private static readonly ConcurrentStack<Graphics> _graphicsPool = new();
该结构利用栈的后进先出特性,快速获取和归还对象,避免锁竞争。
资源获取与释放
  • GetBitmap(width, height):优先从池中弹出可用实例,否则新建
  • ReturnBitmap(bitmap):调用 bitmap.Dispose() 前重置状态并压入栈
确保每次使用后正确归还,防止资源泄漏。
性能对比
策略每秒分配数GC Gen2 回收次数
直接创建120,0008
对象池复用8,0001
复用方案显著减少内存压力,提升系统稳定性。

4.2 基于Task异步处理提升吞吐量与响应性

在高并发系统中,同步阻塞调用会显著降低服务吞吐量。采用基于Task的异步编程模型,可有效释放线程资源,提升系统的响应性与并发处理能力。
异步任务的基本实现
通过async/await语法,将耗时操作(如I/O、网络请求)封装为Task,避免线程空等:
func fetchDataAsync() Task<string> {
    return Task.Run(() => {
        Thread.Sleep(2000); // 模拟异步IO
        return "data";
    });
}
上述代码中,Task.Run将耗时操作调度至线程池,主线程无需阻塞等待结果。
并行任务提升吞吐量
使用Task.WhenAll并发执行多个任务:
  • 减少总体等待时间
  • 充分利用CPU与I/O资源
  • 显著提高单位时间内处理请求数

4.3 内存压力控制:分批处理与流式编码输出

在高并发场景下,大量数据一次性加载至内存易引发OOM(Out-of-Memory)错误。通过分批处理与流式输出可有效缓解内存压力。
分批处理策略
将大任务拆分为固定大小的批次,逐批读取、处理并释放临时对象。常见批大小为1000~5000条记录,依据单条数据体积动态调整。
for offset := 0; offset < total; offset += batchSize {
    batch := fetchRecords(offset, batchSize)
    process(batch)
    // 批次处理完毕后自动释放引用
}
上述代码中,batchSize 控制每轮处理的数据量,避免全量加载;fetchRecords 应使用游标或分页查询实现惰性加载。
流式编码输出
结合 io.Writer 接口,边编码边写入目标流,避免中间缓冲区膨胀。适用于JSON导出、文件下载等场景。 使用流式处理后,内存占用从O(n)降至O(1),显著提升系统稳定性。

4.4 结合Profiler工具进行真实环境性能调优

在真实生产环境中,应用性能瓶颈往往难以通过日志和监控指标直接定位。此时,集成专业的 Profiler 工具成为关键手段。
主流Profiler工具选型
常见的工具有 Java 的 JProfiler、Go 的 pprof、Python 的 cProfile 等。以 Go 服务为例,可通过引入 net/http/pprof 包快速启用性能分析:
import _ "net/http/pprof"
import "net/http"

func init() {
    go http.ListenAndServe("0.0.0.0:6060", nil)
}
上述代码启动独立 HTTP 服务,暴露运行时指标。访问 http://localhost:6060/debug/pprof/ 可获取 CPU、内存、goroutine 等详细数据。
性能数据采集与分析流程
  • 在高负载场景下采集 30 秒 CPU profile:go tool pprof http://<ip>:6060/debug/pprof/profile
  • 使用 top 命令查看耗时最高的函数
  • 通过 web 命令生成调用图,直观识别热点路径
结合实际业务请求链路,可精准定位锁竞争、内存泄漏或低效算法问题,实现针对性优化。

第五章:总结与展望

微服务架构的持续演进
现代云原生系统已逐步从单体架构迁移至微服务,但服务治理复杂性也随之上升。实际项目中,使用 Istio 实现流量切分已成为标准实践:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
  name: user-service-route
spec:
  hosts:
    - user-service
  http:
  - route:
    - destination:
        host: user-service
        subset: v1
      weight: 90
    - destination:
        host: user-service
        subset: v2
      weight: 10
该配置在灰度发布中广泛使用,某电商平台通过此方式将新订单服务逐步上线,降低故障影响范围。
可观测性的关键作用
在分布式系统中,日志、指标与链路追踪缺一不可。以下是某金融系统采用的技术栈组合:
类别工具用途
日志收集Fluent Bit + Loki轻量级日志采集与查询
指标监控Prometheus + Grafana实时性能监控与告警
链路追踪Jaeger跨服务调用链分析
未来技术趋势
  • Serverless 架构将进一步降低运维负担,AWS Lambda 已支持容器镜像部署
  • AI 驱动的异常检测正在集成进 APM 工具,提升故障预测能力
  • 边缘计算场景下,Kubernetes 的 K3s 版本在 IoT 设备中快速普及
某智能物流平台已在边缘节点部署 K3s 集群,实现本地化数据处理与调度决策。
海康/大华工业相机+C# WinForm:5分钟搞定实时图像采集与显示(附完整Demo) 本文详细介绍了如何使用C# WinForm快速集成海康/大华工业相机,实现实时图像采集与显示。通过SDK配置、图像格式转换和跨线程UI更新等核心技术的实战演示,帮助开发者在5分钟内完成工业相机的高效集成,适用于工业视觉检测等场景。 阅读详情

相关推荐

003011013_工业上位机模块化项目模板

本文介绍了一个面向工业线扫视觉检测与自动化设备的.NET上位机模块化项目模板,采用分层架构与依赖倒置原则,通过抽象核心接口(ICamera/IPlc等)实现硬件解耦。项目包含硬件抽象层、实现层、服务层、业务逻辑层和MVVM层,提供相机、PLC、日志等模块的标准实现,支持快速扩展新设备。详细说明了各层核心功能与修改要点,包括Prism框架配置、界面绑定、检测流程控制等,并给出了实战配置步骤与常见问题解决方案,帮助开发者快速构建可扩展的工业视觉检测系统。

qq_39302144的博客 350

【C#】使用System.Drawing.Image类进行图片相关操作

【C#】使用System.Drawing.Image类进行图片相关操作

wangnaisheng的专栏 1万+

Unity一站式直播模块:RTMP/RTSP推流与播放全链路解析

实时音视频传输是现代应用开发中的核心技术,其核心原理在于将采集的音视频数据通过编码压缩,再经由网络协议传输,以实现低延迟、高质量的实时通信。这项技术的核心价值在于解决了跨地域实时交互的难题,广泛应用于虚拟直播、在线教育、远程协作等场景。在Unity引擎中实现这一功能,需要处理从采集、编码到网络传输的完整链路,其中RTMP和RTSP是两种关键的流媒体协议。RTMP凭借其广泛的CDN支持成为直播推流的事实标准,而RTSP则在安防监控等特定领域有重要应用。本文聚焦于Unity环境下的一站式直播模块,深入剖析其如何

weixin_34005042的博客 618

用System.Drawing类实现的绘制直线、矩形、圆形的方法。

如标题所言,使用System.Drawing类来实现简单图形的绘制,这个项目使用C#语言进行winform窗体应用开发,主要功能有:绘制直线、绘制矩形、绘制圆形、ESC结束绘制、清空画布。

weixin_43621583的博客 3759

工业仪表自动抄表实战:C# + YOLO + OCR 端到端落地方案

工业仪表视觉抄表,核心从来不是算法有多高深,而是工程化的细节打磨。YOLO解决定位问题,传统算法解决指针表稳定读数问题,专用OCR解决数字表识别问题,三者组合起来,就是性价比极高的落地方案。而C# + ONNX Runtime的全栈实现,让这套方案可以无缝嵌入现有工控系统,部署维护成本极低。后续可以从两个方向深化:一是引入小样本学习能力,现场新增仪表类型只需少量样本即可快速适配;二是结合历史数据分析读数变化趋势,提前预判仪表故障与异常工况,从被动抄表升级为主动预警。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 291

.NET 8 集成大恒图像工业相机:告别复杂SDK,一行代码启动采集

摘要 本文介绍了基于.NET 8对大恒图像Galaxy系列工业相机SDK的高层封装方案。原生SDK接口复杂,初始化流程冗长,存在内存泄漏等风险。本文采用三层架构设计,通过抽象层定义标准相机接口,封装层处理底层细节,业务层实现品牌无关调用。核心功能包括: 极简API设计,一行代码完成相机初始化与采集启动 完善的事件机制,支持帧数据回调与错误通知 线程安全的采集循环,内置缓冲区管理 支持多种触发模式和像素格式 符合工业级规范,包含自动重连、异常处理等生产环境特性 该封装方案已在实际项目中验证,大幅降低开发门槛,

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 500

C# 图形化编程 System.Drawing

System.Drawing.Graphics //画布 System.Drawing.Drawing2D.GraphicsPath //画图路径,也就是在图上显示的线 System.Drawing.Drawing2...

cuanai3071的博客 760

C#调用ONNX Runtime部署SAM2图像分割实战

图像分割是计算机视觉的基础任务,其核心在于模型推理与工程落地的结合。ONNX Runtime作为跨平台、零Python依赖的高性能推理引擎,支持CPU/GPU/DirectML等多种后端,成为.NET生态部署AI模型的关键技术路径;而SAM2凭借轻量化、时序建模和多模态prompt能力,显著优于SAM1在工业场景的小目标分割与视频流处理表现。C#开发者借助ONNX Runtime可直接集成前沿视觉大模型,规避Python环境冲突与GIL限制,满足工控机、MES系统、医疗影像设备等对稳定性、低依赖、易部署的强

weixin_29083649的博客 246

调用C# System.Drawing 画图

最近公司有个需求,根据处方数据画一张处方图片,方便给用户展示及下载打印。 废话不多说,直接上代码。 第一步:模拟一个get请求: public string Get(int id) { var hostUrl = HostingEnvironment.MapPath("~/") + "Images/"; var imgBack = GetImage(hostUrl+"background.png");//背景图 ...

li315171406的博客 1949

图像编程精髓 c#源码 做自己的Photoshop C# 2010版

图像编程精髓 c#源码 做自己的Photoshop C# 2010版

使用C# System.Drawing 绘制一张处方图片

使用C# System.Drawing 绘制一张处方图片,文字,多图层叠加。

海康VisionMaster实战:零代码搭建工件尺寸与缺陷检测系统

机器视觉作为工业自动化的核心感知技术,通过相机、镜头、光源等硬件获取图像,并利用算法对图像进行分析处理,从而实现对目标的定位、测量、识别与检测。其技术原理在于将物理世界的信息转化为数字图像,再通过图像处理、模式识别等方法提取关键特征。这项技术的核心价值在于替代人眼进行高速、高精度、非接触的自动化检测与引导,大幅提升生产效率和产品质量。在工业领域,典型的应用场景包括尺寸测量、缺陷检测、字符识别(OCR)和机器人引导等。本文聚焦于工业视觉的工程实践,以海康威视的VisionMaster图形化平台为核心,结合工业

weixin_34343308的博客 421

Win10如何使用BC3.1精简版

Win10如何使用BC3.1精简版 使用Borland C++3.1 学习μC/OS—Ⅱ几乎是现在的普遍做法,但是由于Win10系统不能直接使用BC3.1,所以需要用到DOSBox。 1、解压bc3.1精简版压缩包,本文将BC3.1文件夹复制在D盘下,DOSBOX按照默认路径安装。下图为两者安装目录图示: 2、修改DOSBOX的配置文件,找到DOSBox文件安装路径,记事本方式打开DOSBox 0.74-3 Options.bat文件,在此文件末尾添加: MOUNT C D:\BC//意为把D:\BC目录

qq_45547236的博客 2376

基于MediaPipe与Unity的实时人体动作捕捉系统:低成本实现虚拟角色驱动

人体姿态估计是计算机视觉领域的一项基础技术,旨在从图像或视频中识别并定位人体的关键关节位置。其核心原理通常依赖于深度学习模型,通过卷积神经网络提取图像特征,并回归出人体关键点的二维或三维坐标。这项技术的价值在于能够将现实世界的人体运动数字化,为虚拟交互、动画制作和运动分析提供数据基础。在工程实践中,为了实现低延迟的实时驱动,常采用客户端-服务器架构进行模块化解耦。例如,利用MediaPipe等开源框架进行高效的关键点检测,再通过网络通信将数据传输至渲染引擎。这种方案特别适用于虚拟直播、体感游戏和原型测试等应

weixin_30325487的博客 308

Linux 隐藏进程

这种方式属于DKoM(Direct Kernel Object Manipulation)攻击方式了,即直接内核对象操作技术。关于第一种hook方式可以参考上一篇文章。最后推荐一个rootkit工具。

chi's blog 2051

单波束与多波束声呐:从原理到应用场景的全面解析

本文全面解析了单波束与多波束声呐的工作原理、核心特点及应用场景。单波束声呐如精准的狙击手,适合高精度需求;多波束声呐则像高效的散弹枪,适用于快速测绘和大面积覆盖。文章还提供了选型指南和前沿发展趋势,帮助用户根据预算和需求选择最适合的声呐技术。

weixin_30872157的博客 220

基于CW32F030C8T6与OV5647的实时目标追踪系统设计与电赛实践

在嵌入式视觉与运动控制领域,实时目标追踪系统是融合图像处理、传感器技术和自动控制原理的典型应用。其核心原理在于通过摄像头采集环境信息,经图像处理算法识别目标,再通过控制算法驱动执行机构,实现闭环反馈控制。该技术的核心价值在于其高实时性与鲁棒性,广泛应用于智能监控、机器人导航和工业自动化等场景。本文聚焦于资源受限的微控制器(MCU)平台,深入探讨了如何利用**CW32F030C8T6**的DCMI接口与DMA机制高效处理**OV5647**摄像头数据,并设计轻量级图像处理与改进PID控制算法,以应对电赛等实际

weixin_34021089的博客 386

用 sapgenpse 把 SAPCRYPTOLIB 的 SNC 真正配通

摘要: 在SAP系统中配置SNC(Secure Network Communications)时,sapgenpse工具是关键,尤其在旧版本或组件缺乏图形化维护工具时。核心步骤包括安装SAP Cryptographic Library、创建PSE(Personal Security Environment)、生成运行凭据,并确保证书交换顺序正确。常见问题如RFC连接失败或握手错误,往往源于PSE创建或凭据配置不当。需特别注意SECUDIR目录设置、PSE身份管理(单一或独立PSE方案)、以及服务账号凭据的权

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 66

C# 绘图(1)

绘图 1. 概述 2. 坐标系和颜色 3. Graphics类 4. 画笔和画刷 5. 路径 6. 重写OnPaint方法 7. 绘图示例代码 8. 代码下载地址

MechMaster 7950

【STM32实物】基于STM32设计的智能仓储管理系统

近年来,随着我国仓储发展的和药品需求的不断增多,许多医院都采用药物仓储管理系统。我国的药物仓储产业已经有了长足的发展,仓库的规模不断变大,对仓储的要求也不断增高,药物的存储,识别以及对仓储环境条件的要求成为仓储的重要决策,他们可以根据不同的特点在不同场景中使用。本文详细介绍了一个基于单片机技术的智能仓储管理系统的设计与实现,这个系统可谓是集射频识别(RFID)技术和环境监测传感器于一身,旨在提高仓储操作的自动化和精确度。

嵌入式阿齐Archie 1万+

Python爬虫实战教程:如何高效爬取税务局通知通告

税务局发布的通知通告包含政策法规、办税指南、公告信息等,是纳税人、企业合规经营的重要参考。官网发布频率高,手动查看不便,自动爬取并保存,方便信息及时掌握及历史数据归档。本文以合法合规的方式示范,建议实际应用前确认目标网站允许爬取的范围和方式。建议使用pandas进行数据清洗,如去重、空值处理等。对于研究税务政策、进行大数据分析、搭建行业信息平台,爬取税务局通知通告信息尤为关键。公告列表以分页形式展现,包含标题、发布时间和详情页链接。进行政策趋势图、发布频率统计等可视化。爬取公开数据时,务必遵守网站的。

2201_76125261的博客 1781

C# 使用System.Drawing.Bitmap报错

C#使用System.Drawing.Bitmap时报错 最近创建c#项目,使用System.Drawing.Bitmap时报错如下: CS1069 未能在命名空间“System.Drawing”中找到类型名“Bitmap”。此类型已转发到程序集“System.Drawing.Common, Version=0.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51”。请考虑添加对该程序集的引用。 经查主要因为在创建项目时,使用的是.NET Cor

lzz555517的博客 5097

Vue2 - 实现全景图Vr 720°全景效果查看预览功能,3D全景图流畅不卡顿渲染+手势拖拽+悬浮工具按钮,vue实现vr看720度全景效果方案讲解及示例代码(兼容电脑PC网页+手机H5移动端页面)

vue全景VR图,vue h5实现全景720预览,vue加载720全景图_vue怎么加载vr图片,vue实现vr全景看房,vue2实现全景效果,加载很慢卡怎么办,实现全景预览的插件,vue显示720度全景图,720°全景图显示,在h5中展示720°全景图,浏览全景图,基于vue实现vr全景预览,加载全景图,vue全景预览pannellum插件,vue实现3D全景图,实现720°全景图展示,在VUE 中使用three.js实现全景视频播放,vue项目中使用photo-sphere-viewer实现vr720度

🏆 前端领域优质创作者 3317

【C#】SixLabors.ImageSharp和System.Drawing两者知多少

最近升级改造图片功能,发现提示Image只在windows上支持。 这也就是意味着,如何还继续使用System.Drawing下的Image对象,把Core部署到linux系统是会有报错的。 因此,本篇文章就来了解下这两者的基本信息和使用。

小5聊的博客 5900

倍福控制第三方伺服走CSV模式--以汇川伺服为例

在使用TwinCAT软件控制标准CiA402协议的EtherCAT伺服时使用TwinCAT软件NC自带的运动控制指令控制伺服,此时伺服驱动器一般工作在CSP/CSV/CST模式。最常见伺服驱动器工作在CSP模式,轨迹规划运行在TwinCAT软件,位置环速度环电流环运行在伺服驱动器中。该模式下速度波动较大,需要极度平稳的速度需要采用CSV模式。本文讲述的是伺服驱动器工作在CSV模式,此时轨迹规划和位置环均运行在TwinCAT软件,速度环电流环运行在伺服驱动器中。为了简化文字描述,本文采用图文结合的方式介绍伺服

weixin_41883890的博客 4848

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: C# 12两大新特性全面落地:集合表达式与主构造函数的黄金组合应用(稀缺实战案例)
下一篇: 【架构师私藏】Lumen与Slim性能实测对比:数据说话,拒绝盲选
CompiGap
博客等级 码龄1年 147粉丝 1970原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值