C# 创建Bitmap位图中的PixelFormat如何影响stride步幅的计算

创建位图的方法

//
// 摘要:
//     用指定的大小、像素格式和像素数据初始化 System.Drawing.Bitmap 类的新实例。
//
// 参数:
//   width:
//     新 System.Drawing.Bitmap 的宽度(以像素为单位)。
//
//   height:
//     新 System.Drawing.Bitmap 的高度(以像素为单位)。
//
//   stride:
//     指定相邻扫描行开始处之间字节偏移量的整数。 这通常(但不一定)是以像素格式表示的字节数(例如,2 表示每像素 16 位)乘以位图的宽度。 传递给此参数的值必须为
//     4 的倍数。
//
//   format:
//     新 System.Drawing.Bitmap 的像素格式。 这必须指定以 Format 开头的值。
//
//   scan0:
//     指向包含像素数据的字节数组的指针。
//
// 异常:
//   T:System.ArgumentException:
//     指定了名称不以 Format 开头的 System.Drawing.Imaging.PixelFormat 值。 例如,指定 System.Drawing.Imaging.PixelFormat.Gdi
//     将导致一个 System.ArgumentException,但 System.Drawing.Imaging.PixelFormat.Format48bppRgb
//     不会出现这种情况。
public Bitmap(int width, int height, int stride, PixelFormat format, IntPtr scan0);

 

PixelFormat如何影响stride步幅的计算

  1. PixelFormat.Format8bppIndexed:

    • 每像素使用 1 个字节(8 位)表示颜色,通常用于索引颜色表的灰度或调色板图像。
    • stride = (width * 1) + (对齐补足),对齐至 4 字节边界。
  2. PixelFormat.Format16bppRgb555 或 PixelFormat.Format16bppRgb565:

    • 每像素使用 2 个字节(16 位)表示 RGB 颜色。
    • stride = (width * 2) + (对齐补足),对齐至 4 字节边界。
  3. PixelFormat.Format24bppRgb 或 PixelFormat.Format32bppRgb:

    • 每像素分别使用 3 个字节(24 位)或 4 个字节(32 位,额外字节通常为 0 或填充)表示 RGB 颜色。
    • stride = (width * 3) 或 (width * 4) + (对齐补足),分别对齐至 4 字节边界。
  4. PixelFormat.Format32bppArgb 或 PixelFormat.Format32bppPArgb:

    • 每像素使用 4 个字节(32 位)表示 ARGB 颜色,其中 A 代表 Alpha 透明通道。
    • stride = (width * 4) + (对齐补足),对齐至 4 字节边界。
  5. PixelFormat.Format48bppRgb 或 PixelFormat.Format64bppArgb:

    • 每像素分别使用 6 个字节(48 位)或 8 个字节(64 位)表示高精度 RGB 或 ARGB 颜色。
    • stride = (width * 6) 或 (width * 8) + (对齐补足),分别对齐至 4 字节边界。

 

注意点

  • 确保 stride 符合要求: 如前所述,stride 必须是 4 字节的倍数。在计算时,如果直接按像素字节数乘以宽度得到的值不是 4 的倍数,则需要添加额外的填充字节,使其对齐至 4 字节边界。

  • 内存对齐:stride 可能不是简单地 width * bytes_per_pixel,因为某些硬件和操作系统可能要求内存按特定边界对齐。例如,它可能是 4 的倍数,以确保内存访问效率。

  • 正确计算 scan0 指针: scan0 参数是指向包含像素数据的字节数组的指针。当创建或操作位图时,需要确保该指针指向正确的位置,即首行像素数据的起始地址。这通常需要根据 stride 和 height 计算得出。

  • 内存管理: 使用指针传递像素数据时,需要确保内存的有效性和生命周期。确保分配了足够的内存来存储整个位图数据,并在不再需要时正确释放内存,以避免内存泄漏。

  • 兼容性与性能: 不同的 PixelFormat 可能会影响图像的兼容性和处理性能。例如,带有 Alpha 通道的格式(如 Format32bppArgb)提供了透明度信息,但可能不被所有软件或硬件完全支持;而某些特定格式(如 16 位 RGB)可能更适合某些图形硬件加速。

  • 跨平台注意事项: 如果涉及跨平台操作,不同的操作系统或图形库可能对位图格式的支持有所差异。在设计和实现时,应考虑目标平台的兼容性需求。

  • 数据访问一致性: 当直接操作底层像素数据时,要注意多线程环境下的数据同步问题,以防止数据竞争导致的图像损坏。

  • 性能考虑:对于大型位图或频繁操作的位图,不恰当的 stride 设置可能会导致性能问题。尽量使 stride 与硬件和操作系统的内存访问模式相匹配。

 

总结

在使用 Bitmap(int width, int height, int stride, PixelFormat format, IntPtr scan0) 构造函数时,应仔细考虑 stride 与 PixelFormat 的关系,确保正确的内存布局和数据访问,同时注意相关的内存管理和性能因素。

 

举例

如果是PixelFormat.Format24bppRgb,如何计算stride步幅,代码如下:

//如果是PixelFormat.Format24bppRgb
int bytesPerPixel = 3; // 对于 Format24bppRgb
int width = ...; // 图像的实际宽度
int padding = (4 - (width * bytesPerPixel) % 4) % 4;
int stride = width * bytesPerPixel + padding;
stride = ((stride + 3) / 4) * 4;

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/550260.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity 点击次数统计功能

介绍 💡.调用方便,发生点击事件后直接通过"xxx".CacheClick缓存 💡. 在允许的时间间隔内再次点击会累计点击次数,直到超出后触发事件 传送门👈

计算机视觉——OpenCV Python基于颜色识别的目标检测

1. 计算机视觉中的颜色空间 颜色空间在计算机视觉领域的应用非常广泛,它们在图像和视频处理、物体检测等任务中扮演着重要角色。颜色空间的主要作用是将颜色以数值形式表示出来,这样计算机算法就能够对其进行处理和分析。不同的颜色空间有着不同的特点和…

uniapp--登录和注册页面-- login

目录 1.效果展示 2.源代码展示 测试登录 login.js 测试请求 request.js 测试首页index.js 1.效果展示 2.源代码展示 <template><view><f-navbar title"登录" navbarType"4"></f-navbar><view class"tips"><…

2024蓝桥杯每日一题(最大公约数)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一&#xff1a;公约数 试题二&#xff1a;最大公约数 试题三&#xff1a;等差数列 试题四&#xff1a;最大比例 试题五&#xff1a;Hankson的趣味题 试题一&#xff1a;公约数 【题目描述】 …

冯喜运:4.16晚间关注原油EIA数据黄金原油分析

【 黄金技术面分析】&#xff1a;周二黄金价格日内走跌&#xff0c;白盘低点触及2363一线止跌反弹&#xff0c;实时现报价2372一线。目前小时线布林带逐步收口&#xff0c;上轨位于2392一线&#xff0c;下轨布林带在2351位置。今晚阻力关注2389和今日高点2392区域&#xff0c;其…

二级综合医院云HIS系统源码,B/S架构,采用JAVA编程,集成相关医保接口

二级医院云HIS系统源码 云HIS系统是一款满足基层医院各类业务需要的健康云产品。该产品能帮助基层医院完成日常各类业务&#xff0c;提供病患预约挂号支持、病患问诊、电子病历、开药发药、会员管理、统计查询、医生工作站和护士工作站等一系列常规功能&#xff0c;还能与公卫…

海外云手机为什么适合社媒运营?

如今&#xff0c;社媒营销如果做得好&#xff0c;引流效果好的账号&#xff0c;可以用来带货变现&#xff0c;而外贸、品牌出海也同样都在做社媒营销&#xff0c;Tik Tok、facebook、ins等热门的海外社媒平台都是行业密切关注的&#xff0c;必要的时候&#xff0c;大家会使用海…

基于微信小程序投票评选系统的设计与实现(论文+源码)_kaic

摘 要 社会发展日新月异&#xff0c;用计算机应用实现数据管理功能已经算是很完善的了&#xff0c;但是随着移动互联网的到来&#xff0c;处理信息不再受制于地理位置的限制&#xff0c;处理信息及时高效&#xff0c;备受人们的喜爱。所以各大互联网厂商都瞄准移动互联网这个潮…

Unity类银河恶魔城学习记录12-18,19 p140 Options UI-p141 Finalising ToolTip源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI_ToolTip.cs using TMPro; using UnityEngine;public class UI_ToolTip :…

AppleScript初体验,让你的mac实现自动化UI操作

AppleScript 简介 AppleScript是苹果公司开发的一种脚本语言&#xff0c;用于操作MacOS及其应用程序&#xff0c;在实现MacOS自动化工作方面非常给力。 我们可以使用AppleScript用来完成一些重复琐碎的工作&#xff0c;AppleScript具有简单自然的语法&#xff0c;另外系统也提…

智能零售:引领购物新时代

智能零售通过整合人工智能、物联网、大数据和机器学习等技术&#xff0c;正在彻底改变传统的购物模式&#xff0c;为消费者和零售商提供前所未有的效率和个性化体验。 智能零售利用消费者数据分析来提供个性化的购物推荐。无论是在线平台或是实体店内&#xff0c;智能系统都能…

C#语法知识之变量

2.变量 一、知识点 1、折叠代码 //#region按Tab键#region MyRegion(描述)#endregion //本质是编译器提供给我们的预处理指令&#xff0c;发布代码是会被自动删除2、声明变量和变量类型 ​ 变量就是可以变化的容器&#xff0c;用来存储各种不同类型数值的一个容器&#xff1b…

和鲸科技将参与第五届空间数据智能学术会议并于应急减灾与可持续发展专题论坛做报告分享

ACM SIGSPATIAL中国分会致力于推动空间数据的研究范式及空间智能理论与技术在时空大数据、智慧城市、交通科学、社会治理等领域的创新与应用。ACM SIGSPATIAL中国分会创办了空间数据智能学术会议&#xff08;SpatialDI&#xff09;&#xff0c;分会将于2024年4月25日-27日在南京…

Go Plugin:动态模块的加载与问题解析_go语言加载动态库的工具(1)

先自我介绍一下&#xff0c;小编浙江大学毕业&#xff0c;去过华为、字节跳动等大厂&#xff0c;目前阿里P7 深知大多数程序员&#xff0c;想要提升技能&#xff0c;往往是自己摸索成长&#xff0c;但自己不成体系的自学效果低效又漫长&#xff0c;而且极易碰到天花板技术停滞…

人工智能与IP代理池:解析网络数据采集的未来

前言 随着互联网的快速发展&#xff0c;数据成为了当今社会最宝贵的资源之一。然而&#xff0c;要获取大量的网络数据并进行有效的分析&#xff0c;往往需要面对诸多挑战&#xff0c;其中之一就是网络封锁与反爬虫机制。在这个背景下&#xff0c;人工智能&#xff08;AI&#x…

JavaEE:JVM

基本介绍 JVM&#xff1a;Java虚拟机&#xff0c;用于解释执行Java字节码 jdk&#xff1a;Java开发工具包 jre&#xff1a;Java运行时环境 C语言将写入的程序直接编译成二进制的机器语言&#xff0c;而java不想重新编译&#xff0c;希望能直接执行。Java先通过javac把.java…

02 - ArcGIS For JavaScript-矢量数据的符号化处理(Symbol)

文章目录 综述Symbol的分类Point的符号化Point符号化为二维几何&#xff1a;Point位图符号化&#xff1a;Point的三维结合符号化Point 符号化为GLTF模型 PolylineSymbol-线符号化基本样式管道样式墙体样式条带样式方管样式 PolygonSymbol-面符号化水面效果拉伸效果填充效果 Mes…

外面收费的彩虹自助下单系统模板

搭建教程 下载之后上传到template文件夹里面 注意带上里面的文件夹 然后去后台替换就行 源码免费下载地址抄笔记 (chaobiji.cn)

PLSQL中文乱码问题 + EZDML导入数据库模型乱码

PLSQL中文乱码问题 EZDML导入数据库模型乱码 查询数据库字符集 select userenv(language) from dual;查询本地字符集编码 select * from V$NLS_PARAMETERS;理论上 数据库字符集 跟 本地字符集编码 是一致的 本地字符集编码需要拼接字段值 NLS_LANGUAGE NLS_TERRITORY NLS…

项目7-音乐播放器2(上传音乐+查询音乐+拦截器)

0.加入拦截器 之后就不用对用户是否登录进行判断了 0.1 定义拦截器 0.2 注册拦截器 生效 1.上传音乐的接口设计 请求&#xff1a; { post, /music/upload {singer&#xff0c;MultipartFile file}&#xff0c; } 响应&#xff1a; { "status": 0, "message&…
最新文章