C#位图指针操作的漂亮写法

C#调用C++动态库:P/Invoke、C++/CLI与COM Interop方案详解 在软件架构中,跨语言互操作是连接不同技术生态、实现性能与开发效率平衡的关键技术。其核心原理是通过定义清晰的二进制接口(ABI),在运行时实现内存数据与函数调用的跨语言映射,这一过程通常涉及数据列集(Marshaling)与调用约定(Calling Convention)的协调。该技术的核心价值在于能够充分发挥各语言优势,例如结合C#的快速开发能力与C++的底层性能,从而构建高性能桌面应用、游戏引擎或工业控制系统。典型的应用场景包括图像处理、音视频编解码、硬件驱动集成以及遗留代码复用。本文以C#调用C++动态 阅读详情


丑陋的写法:

for (int y = 0; y < data.Height; y++)
{
    for (int x = 0; x < data.Width; x++)
    {
        // write the logic implementation here

        ptr += 3;
    }
    ptr += data.Stride - data.Width * 3;
}

优雅的写法:


using System.IO;
using System.Drawing;
using System.Drawing.Imaging;

--------------------------------------------------------

if (Path.GetExtension(file_path) != ".png")
{
    return false;
}

Bitmap bmp = new Bitmap(file_path);
BitmapData data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);

// 开启unsafe模式 项目 → 右键 → Properties → Build → Allow unsafe code
unsafe
{
    byte* pData = (byte*)(data.Scan0);

    //int pixelBytes = 4; // 每个像素的字节数
    int pixelBytes = (data.Stride / data.Width); // 每个像素的字节数 = (每行的字节数/每行的像素数)

    //[0]B [1]G [2]R [3]A
    for (int y = 0; y < data.Height; y++)
    {
        for (int x = 0; x < data.Width; x++)
        {
            // 计算指针偏移量
            byte* pPiexl = pData + (y * data.Stride) + (x * pixelBytes);

            byte b = pPiexl[0];
            byte g = pPiexl[1];
            byte r = pPiexl[2];
            byte a = pPiexl[3];
            /*
            byte b = pData[y*data.Stride + x*pixelBytes + 0];
            byte g = pData[y*data.Stride + x*pixelBytes + 1];
            byte r = pData[y*data.Stride + x*pixelBytes + 2];
            byte a = pData[y*data.Stride + x*pixelBytes + 3];
            */

            Console.Write("[" + String.Format("{0,3:000}", a) + "," + String.Format("{0,3:000}", r) + "," + String.Format("{0,3:000}", g) + "," + String.Format("{0,3:000}", b) + "]");
        }
        Console.WriteLine("\r\n");
    }

}

bmp.UnlockBits(data);
bmp.Dispose();

emWin Flex皮肤定制:从原理到实战,打造专业嵌入式GUI界面 在嵌入式GUI开发中,控件皮肤定制是实现界面美观与品牌差异化的核心技术。其原理基于回调函数与命令驱动的绘制引擎,通过结构化的配置数据(如颜色、渐变)将视觉表现与业务逻辑解耦,从而提升代码可维护性。这项技术的核心价值在于,它允许开发者在不修改核心逻辑的前提下,全方位重塑控件外观,满足现代产品对UI的个性化需求。典型的应用场景包括工业HMI、智能家居面板、医疗设备等对界面有较高要求的嵌入式设备。本文聚焦于emWin的Flex皮肤系统,深入解析MULTIPAGE、PROGBAR、RADIO等核心控件的定制方法,涵 阅读详情

相关推荐

Windows Embedded CE 6.0 R3:高置信度平台与Silverlight嵌入式UI开发实战

在嵌入式系统开发领域,实时操作系统(RTOS)与图形用户界面(GUI)框架的选择,直接影响着产品的开发效率、硬件控制力与最终用户体验。其核心原理在于,通过成熟的商业平台整合软硬件生态,为开发者提供熟悉的工具链和已验证的组件,从而构建一个“高置信度平台”,显著降低技术门槛与商业风险。这种模式的技术价值在于,它允许开发团队将精力集中于产品核心功能与差异化设计,而非底层通用技术问题的重复解决,尤其适用于对上市周期和成本控制敏感的工业控制、医疗终端、车载信息娱乐等应用场景。本文聚焦的Windows Embedded

weixin_34216107的博客 305

Bitmap的优化

摘自:http://www.codeproject.com/Tips/240428/Work-with-bitmap-faster-with-Csharp#_rating 作者:Vano Maisuradze   当你在C#中操作bitmaps时,你可以使用 GetPixel(x ,y) 和 SetPixel(x, y, color) 去获取/设置特定像素的值。但是它们十分的慢。  ...

weixin_30692143的博客 104

嵌入式开发中的LED灯光模式设计:从状态机到非阻塞定时实践

在嵌入式系统与物联网开发中,时序控制和状态管理是核心基础概念。状态机作为一种强大的编程模型,能够清晰描述系统在不同状态间的转移逻辑,尤其适用于处理具有顺序步骤的流程。而非阻塞定时技术则通过基于时间戳的条件检查,替代传统的阻塞式延时,确保微控制器在等待期间仍能高效响应其他任务,这是实现多任务系统的关键。这些技术共同为创建动态、可交互的硬件应用提供了坚实基础,其工程价值在于提升代码的响应性、可维护性与可扩展性。在智能家居、穿戴设备、状态指示等场景中,通过精心设计的灯光模式(Pattern),可以将这些原理转化为

weixin_33898233的博客 425

C#进行图像处理的几种方法(bitmap,bitmapData,IntPtr)

本文讨论了C#图像处理中Bitmap类、BitmapData类和unsafe代码的使用以及字节对齐问题。 Bitmap类 命名空间:System.Drawing 封装 GDI+ 位图,此位图由图形图像及其属性的像素数据组成。Bitmap 是用于处理由像素数据定义的图像的对象。 利用C#类进行图像处理,最方便的是使用Bitmap类,使用该类的GetPixel()与SetPix

zhhanczhasd的专栏 6513

.NET(C#) 中使用指针

在 .NET 中,C# 默认情况下是一种安全的、不支持直接使用指针的语言。然而,C# 支持在特定情况下使用不安全代码(即可以使用指针的代码)。使用不安全代码意味着放弃了 C# 和 .NET 运行时提供的一些安全保障,因此必须谨慎使用。不安全代码可能会增加程序出错的风险,特别是与内存管理相关的错误,如堆损坏、内存泄漏等。指针操作通常只在性能至关重要的情况下使用,或者在需要与系统级别或非托管代码互操作时使用。

weixin_42098295的博客 1815

C#中的BitArray类及其用法

它提供了一组方法和属性,用于设置、获取和操作位的值。在编写需要对位进行操作的应用程序时,BitArray类是一个非常有用的工具。BitArray是C#中的一个类,用于表示和操作位数组。BitArray类还提供了一些其他有用的属性和方法,用于获取位数组的长度、反转位、进行逻辑运算等。可以通过查看C#官方文档来了解更多详情。BitArray类是System.Collections命名空间中的一部分,因此在使用之前,需要添加对该命名空间的引用。在上面的示例中,我们创建了一个长度为32的BitArray对象。

ByteHero的博客 740

[C#] C#中的指针

  C#在有限的范围内支持指针。C#的指针只不过是一个持有另一类型内存地址的变量。但是在C#中,指针只能被声明为持有值类型和数组的内存地址。与引用类型不同,指针类型不被默认的垃圾收集机制所跟踪。出于同样的原因,指针不允许指向引用类型,甚至不允许指向包含引用类型的结构类型。我们可以说,指针只能指向非托管类型,包括所有基本数据类型、枚举类型、其他指针类型和只包含非托管类型的结构。 声明指针类型 声明指针类型的一般形式如下所示, type *variable_name; 其中 * 称为取消引用运算符。例如下面的语

unity尧明的博客 2万+

C#实现位图(附完整源码)

C#实现位图(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 338

提高c#位图操作的速度[抄袭之作]

众所周知,c#里 bitmap类里的getpixel和setpixel函数的效率很慢,一个解决办法是使用bitmapData对位图进行指针操作, 而在用指针在进行读取的时候,对于不用格式(PixelFormat)的位图,要进行区分。十分的麻烦。前几天无意中在codeproject上看到一篇文章, 对于bitmapData的进行了封装,相当的漂亮,所以就抄了过来,仅供参考,原文在这里。 代码如...

weixin_30687051的博客 331

c# 实现位图算法(BitMap)

主要介绍了c# 如何实现位图算法(BitMap),文中讲解非常细致,帮助大家更好的理解和学习,感兴趣的朋友可以了解下

1.2 重叠因子:双重指数移动平均(Double Exponential Moving Average, DEMA)概念与Python实战

双重指数移动平均(Double Exponential Moving Average, DEMA)是一种改进的移动平均线指标,由Patrick Mulloy在1994年开发。相比传统的指数移动平均线(EMA),DEMA通过减少滞后性来提供更快的市场反应。它通过两次计算EMA并进行特殊组合来实现这一目标,可以在保持平滑性的同时减少滞后。

Kewin的博客 2168

保存位图位图保存时上下颠倒?

文章结束给大家来个程序员笑话:[M] 位图取读时,一般都是 for(GLint j=0; j< pThis->m_nHeight-1; j++) { for(GLint k=0; k< pThis->m_nWidth-1; k++) { pixels[i][j]= pf[m_n...

weixin_30652879的博客 217

【学习笔记】计算机网络 第八章 无线局域网(WLAN)

计算机网络 第八章 无线局域网(WLAN)

Vera_shsf的博客 1243

C#程序设计下,网易云课堂,计算机专业

C#程序设计下,网易云课堂,计算机专业

湾区人工智能 780

从入门到精通:MATEKH743 飞控全解析——MAVLink 接口软/硬件对接实战

MATEKH743飞控是基于STM32H743微控制器的无人机核心控制系统,具备强大计算能力和丰富外设接口。该飞控采用双核架构,集成高性能IMU、气压计等传感器,支持多种开源固件(Betaflight/INAV/ArduPilot),适用于FPV穿越机、固定翼及工业无人机。相比PX4等飞控,MATEKH743在性价比和DIY友好度上优势明显,同时支持MAVLink协议实现设备通信。未来发展方向包括集成更高精度传感器、优化电源管理以及拓展工业应用场景,持续推动无人机技术创新。

bother3000的博客 2284

异步fifo的UVM验证(最终最终版)

更新了refmdl以及scb

qq_44674008的博客 2988

手写C# B树实现:从IO原理到页分裂的工程实践

B树是数据库索引与磁盘存储的核心数据结构,其设计本质是为缓解CPU与磁盘之间的巨大性能鸿沟——一次磁盘IO耗时相当于8万次内存运算。理解B树,关键在于掌握‘最小填充率’‘叶子同高’‘键指针守恒’等底层约束,而非仅记忆O(log n)时间复杂度。它通过提升节点度(T值)减少树高,从而压缩IO次数,直接决定查询延迟与索引效率。在.NET生态中,缺乏可调试、可教学的B树参考实现,导致开发者难以深入索引优化、填充因子调优、页分裂机制等真实场景。本文以纯C#手写可运行B树为载体,聚焦IO感知设计、分裂边界处理与迭代插

dianlu5775的博客 552

【TELEMAC V8P4】TELEMAC-2D 用户手册核心概念与应用场景速览

本文深入解析了TELEMAC-2D水动力模型的核心概念与应用。作为基于二维浅水方程的开源数值模拟工具,TELEMAC-2D广泛应用于河流动力学、洪水演进、污染物输运及泥沙运动模拟。文章结合用户手册与实战经验,详细拆解了其理论框架、关键物理过程(如湍流模型、干湿网格处理),并提供了从模型搭建、文件配置到典型场景(如工程评估、污染应急、洪水模拟)的实用指南,帮助用户快速掌握这一强大工具。

weixin_29200741的博客 163

多维聚合不是加GROUP BY:从OLAP立方体到分层预计算的工程实践

多维聚合是OLAP分析的核心能力,本质是构建具备维度层级、坐标绑定与上下文依赖的数据立方体(Cube),而非简单SQL分组。其技术难点在于平衡精度、性能与灵活性的不可能三角:传统GROUP BY丢失粒度与拓扑关系,星型模型面临JOIN爆炸与维度变更雪崩,而实时即席查询又受制于明细扫描开销。现代解法聚焦维度分层预计算、位图索引加速、物化视图智能重写及动态语义注入,结合Pandas优化、ClickHouse与Doris引擎选型、Flink实时维度关联等工程手段,实现从秒级到毫秒级响应跃迁。本文深入生产级多维聚合

523

Voronoi算法构建多晶

孪晶多晶 采用孪晶的原子链作为种子通过voronoi算法可以得到孪晶多晶结构。 孪晶种子: txt文件不需要特殊设置 box 150 150 150 random 8 得到孪晶多晶: 通过改变孪晶种子的长度可以得到不同孪晶片层厚度的多晶。 准二维柱晶 所有晶粒在某一维度的晶向一致,晶粒仅在平面内具有旋转关系,所有晶界为旋转对称晶界,这种结构的多晶其位错滑移在某些方向受限,但是能极大的提高晶粒...

yamatachi的博客 5280

【Matlab】如何使用Simulink进行电池建模和SOC预估

“通过Simulink电池建模进行SOC预估,其实挺容易!” 1 声明 本文只描述一般性电池建模方法,文中出现的电池相关数据来自一些论文或者外文文献,对数据的真实性不做任何保证。 本文参考了不少国内高校的硕士论文和外文文献,所以本篇文章只作为学术性交流,未经...

wanff1204的博客 2万+

PE-bear:轻量级PE文件分析工具的核心功能与实战应用

在软件安全与逆向工程领域,理解可执行文件的结构是基础。Windows平台的可执行文件(PE文件)遵循特定的格式标准,其内部包含DOS头、NT头、节区表以及导入表、导出表、资源等关键数据结构。掌握这些结构的解析原理,对于恶意软件分析、漏洞研究、软件调试及加壳脱壳等技术实践至关重要。它使分析者能够在不运行程序的情况下,快速洞察其功能模块、依赖关系和潜在风险。PE-bear作为一款专注于PE文件结构的图形化分析工具,正是基于这一技术价值,将复杂的结构以直观的树形导航和详细视图呈现,极大提升了静态分析的效率。在应用

weixin_34208185的博客 351

python3.12 百分百解决安装dlib失败问题【研究原理后Bug已解决】

python3.12 百分百解决安装dlib失败问题【研究原理后Bug已解决】 python3.12版本下安装dlib失败。截图如下。试了网上很多方法都失败,耗费了很多时间终于找到适用于python3.12版本安装dlib的方法,亲测百分百成功。几乎尝试了所有的方法都不太行。终于找到安装的方法了。 原因分析: 版本匹配问题。我们现在是python3.12 使用pip根本无法安装。下面我们一起手动安装,1分钟搞定。

一键难忘的博客 7129

C#位图BitArray 小试牛刀

前面聊了布隆过滤器,回归认识一下位图BitMap,阅读前文的同学应该发现了布隆过滤器本身就是基于位图,是位图的一种改进。难缠的布隆过滤器,这次终于通透了位图先看一个问题, 假如有1千万个整...

qq_30236895的博客 314

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C# 指针操作

以下总结C#指针操作的知识点 一、unsafe的用法 1、C#使用指针首先要用unsafe声明 unsafe声明可以用在方法或代码块 (1)方法声明为unsafe static unsafe void Main(string[] args) { int var = 20; int* p = &var...

灰太狼的小秘密 3967

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

c#指针的使用总结(史上最全,不全你来找我)

1、何时用指针? 我们一般在和硬件交互的时候,还比如C#做图像处理的时候,针对大量的数据处理,这时候我们如果使用指针直接访问内存的话会在效率上提高很多(具体没实测,网上都这么说。。。) 2、在c#中怎么用指针? 在c#中一般通过不安全的代码来实现直接操纵内存和地址, 1)unsafe static void FastCopy(byte[] src, byte[] dst, int count) {...

qq_34059233的博客 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: Android屏幕兼容性
下一篇: 面试的时候遇到过的问题
sonikk
博客等级 码龄15年 68粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值