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.mzph.cn/news/822076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue加载glb / gltf模型(如何在vue中使用Three.js,vue使用threejs加载glb模型)

简介:Three.js 是一个用于在 Web 上创建和显示 3D 图形的 JavaScript 库。它提供了丰富的功能和灵活的 API,使开发者可以轻松地在网页中创建各种 3D 场景、模型和动画效果。可以用来展示产品模型、建立交互式场景、游戏开发、数据可视化、教育和培训等等…

在redhat7/8平台上部署ELK7.17.18的技术方案

部署环境说明 为节省资源直接使用1台测试机模拟3节点elasticsearch服务集群做部署,在该主机上同时部署了3个elasticsearch实例、1个logstash实例、1个kibana实例、1个filebeat实例。对于生产环境,以上实例服务应该做分布式部署。 ELK-TEST1 192.168.10…

嵌入式4-16

tftpd #include <myhead.h> #define SER_IP "192.168.125.243" //服务器IP地址 #define SER_PORT 69 //服务器端口号 #define CLI_IP "192.168.125.244" //客户端IP地址 #define CLI_PORT 8889 //客户端端…

解读科技智慧公厕改变生活的革命性创新之路

公共厕所&#xff0c;作为城市基础设施的一部分&#xff0c;一直以来都备受人们诟病。脏乱差、设施老旧、管理混乱&#xff0c;成为公共厕所长期存在的问题。然而&#xff0c;随着科技的不断进步&#xff0c;智慧公厕应运而生&#xff0c;为解决公厕难题&#xff0c;智慧公厕源…

目标检测YOLO实战应用案例100讲-自动驾驶场景下的三维目标检测技术研究(续)

目录 知识储备 自动驾驶中多模态三维目标检测 3D目标检测是什么? 1、定义

【ElasticSearch】安装(bug篇)

以下解决办法参考自网友们的分享 1. JDK绑定问题 但其实这样也没有问题&#xff0c;因为内嵌的jdk版本与当前的es版本是适配的 但是&#xff0c;如果内嵌的jdk与当前es不适配&#xff0c;那就要修改配置文件 / 添加环境变量&#xff0c;让es启动的时候能扫描到我们本地的jdk …

安全地创建一个临时文件 - mkstemp

安全地创建一个临时文件 - mkstemp 在我们处理一些敏感数据的时候&#xff0c;可能必须要临时存储在文件中&#xff0c;这个时候就需要创建临时文件&#xff1b; 在我们需要临时创建一些大量的中间数据&#xff0c;并且在程序结束时删除这些文件时&#xff0c;我们就需要创建临…

知识点static、事务的特性、接口

2024-4-16杂记 今日没有学习新的知识&#xff0c;但是学习了一些知识点 事务特性&#xff1a;ACID 1.原子性【Atomicity】&#xff1a;表示事务要么全部完成&#xff0c;要么全部不完成 2.一致性【Consistency】&#xff1a;表示事务处理后数据库&#xff0c;从一个一致性状…

蓝桥杯刷题-货币系统

1371. 货币系统 - AcWing题库 #include <bits/stdc.h>using namespace std;typedef long long LL; const int N 30; LL v , n; LL f[10010]; LL ways 0;int main() {cin >> v >> n;f[0] 1; //初始化 f[0][0] 1 for(int i 1; i < v; i){int v;cin&g…

校园水电能源智能化管理系统

校园作为大量人员集聚的场所&#xff0c;水电能源的高效管理对于降低运营成本、保障安全稳定供应以及推动可持续发展至关重要。校园水电能源智能化管理系统应运而生&#xff0c;通过先进技术的应用&#xff0c;实现了对校园水电资源的智能监控、计量和管理。本文将从系统背景、…

Elasticsearch:下载、启动和账号密码登录

因为我的电脑是 window&#xff0c;以下都是以 window 环境举例。 一、下载 Elasticsearch 是使用 java 开发的&#xff0c;且 7.8 版本的 ES 需要 JDK 版本 1.8 以上&#xff0c;安装前注意java环境的准备。 官网地址&#xff1a;https://www.elastic.co/cn/ 下载地址&#xf…

Gitlab相关,【推送项目】

推送现有文件夹 cd existing_folder git init git remote add origin git10.200.5.138:taps/archetech.git git add . git commit -m "Initial commit"git pull -u origin master另外 git branch -b new_branch //创建本地分支并切换 git branch //查看本地分支 …

最新可用免费云服务器推荐汇总

随着云计算技术的不断发展&#xff0c;越来越多的企业和个人开始关注并尝试使用云服务器。云服务器以其高度的灵活性、可扩展性和成本效益&#xff0c;成为了部署应用和存储数据的理想选择。本文将为大家汇总目前市场上最新可用的免费云服务器资源&#xff0c;帮助大家更好地了…

深入了解Java Stream中的distinct()方法:按一个或多个指定对象字段进行去重

深入了解Java Stream中的distinct()方法&#xff1a;按一个或多个指定对象字段进行去重 在Java编程中&#xff0c;Stream API为我们提供了丰富的操作方法来处理集合数据。其中&#xff0c;distinct()方法是一种常用的方法&#xff0c;用于去除Stream中的重复元素。然而&#x…

Linux基础|线程池Part.1|线程池的定义和运行逻辑

线程池的定义和运行逻辑 多线程的问题&#xff1a; 如果并发的线程数量很多&#xff0c;并且每个线程都是执行一个时间很短的任务就结束了&#xff0c;这样频繁创建线程就会大大降低系统的效率&#xff0c;因为频繁创建线程和销毁线程需要时间。 那么一个很自然的想法就出现了…

django.template.exceptions.TemplateDoesNotExist: bootstrap3/field.html

django使用xadmin时报错 1、报错原因 django.template.exceptions.TemplateDoesNotExist: bootstrap3/field.html2、原因 在django中使用xadmin时会报这个错,这是由于django高版本与xadmin不兼容导致的。 3、解决方案 导入库: pip install crispy_bootstrap3 -i https:…

蓝桥杯刷题-毕业旅行问题

731. 毕业旅行问题 - AcWing题库 /* 起点变为1 ~ n - 1号点&#xff0c;终点变为0号点 */ #include <bits/stdc.h>using namespace std; #define x first #define y second typedef long long LL; typedef pair<int , int> PII;const int N 10 , M (1 << …

AI音乐,8大变现方式——Suno:音乐版的ChatGPT - 第505篇

悟纤之歌 这是利用AI为自己制作的一首歌&#xff0c;如果你也感兴趣&#xff0c;可以花点时间阅读下本篇文章。 ​ 导读 随着新一代AI音乐创作工具Suno V3、Stable audio2.0、天工SkyMusic的发布&#xff0c;大家玩自创音乐歌曲&#xff0c;玩的不亦乐乎。而有创业头脑的朋友…

mysql 转pg 两者不同的地方

因项目数据库&#xff08;原来是MySQL&#xff09;要改成PostgreSQL。 项目里面的sql要做一些调整。 1&#xff0c;写法上的区别&#xff1a; 1&#xff0c;数据准备&#xff1a; 新建表格&#xff1a; CREATE TABLE property_config ( CODE VARCHAR(50) NULL…

【UE5.1】使用MySQL and MariaDB Integration插件——(4)修改、插入、删除数据

目录 效果 步骤 一、修改 二、插入、删除 在上一篇博客&#xff08;【UE5.1】使用MySQL and MariaDB Integration插件——&#xff08;3&#xff09;表格形式显示数据&#xff09;基础上继续实现修改、插入和删除数据库数据的功能 效果 修改数据&#xff1a; 插入数据&…