为什么 System.Drawing.Bitmap 构造函数中的“stride”必须是 4 的倍数?

2024-02-14

我正在编写一个应用程序,需要我采用专有位图格式(MVTec Halcon HImage)并将其转换为 C# 中的 System.Drawing.Bitmap。

除了使用“获取指针”函数之外,提供给我的唯一可以帮助我执行此操作的专有函数涉及写入文件。

这个函数很棒,它给了我一个指向像素数据、宽度、高度和图像类型的指针。

我的问题是,当我使用构造函数创建 System.Drawing.Bitmap 时:

new System.Drawing.Bitmap(width, height, stride, format, scan)

我需要指定一个 4 的倍数的“步幅”。 这可能是一个问题,因为我不确定我的函数将使用什么大小的位图。 假设我最终得到一个 111x111 像素的位图,除了向图像添加一个假列或减去 3 列之外,我无法运行此函数。

有什么办法可以绕过这个限制吗?


这可以追溯到早期的 CPU 设计。处理位图位的最快方法是从扫描行的开头开始一次读取 32 位。当扫描线的第一个字节在 32 位地址边界上对齐时,效果最佳。换句话说,地址是 4 的倍数。在早期的 CPU 上,第一个字节未对齐将花费额外的 CPU 周期来从 RAM 读取两个 32 位字并打乱字节以创建 32 位值。确保每条扫描线从对齐的地址开始(如果步幅是 4 的倍数则自动)可以避免这种情况。

对于现代 CPU 来说,这不再是一个真正的问题,现在与缓存行边界的对齐更加重要。尽管如此,由于应用程序兼容性的原因,步幅的 4 倍数要求仍然存在。

顺便说一句,您可以通过以下方式轻松计算格式和宽度的步幅:

        int bitsPerPixel = ((int)format & 0xff00) >> 8;
        int bytesPerPixel = (bitsPerPixel + 7) / 8;
        int stride = 4 * ((width * bytesPerPixel + 3) / 4);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 System.Drawing.Bitmap 构造函数中的“stride”必须是 4 的倍数? 的相关文章

  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • 我可以使用 lambda 函数或 std::function 对象来代替函数指针吗?

    我有一个需要使用的库 它定义了以下内容 typedef void CallbackFunction const int i 并且有一个注册回调的函数 如下所示 void registerCallback CallbackFunction p

随机推荐

  • 连接到远程 IPython 实例

    我想在一台机器上运行 IPython 实例 并从不同的进程连接到它 通过 LAN 以运行一些 python 命令 我知道 zmq 是可能的 http ipython org ipython doc dev development ipyth
  • 信号量简单示例[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 谁能分享使用信号量的简单示例吗 如果
  • Type 对象属性的 TypeConverter

    我需要在属性网格中正确显示对象 我的班级看起来像这样 public class PropertyItem public PropertyDescription PropertyDescription get set Description
  • 如何在打字稿中使用枚举作为索引键类型?

    考虑下面的例子 enum DialogType Options Help class Dialog test string return class Greeter openDialogs key in DialogType Dialog
  • 如何编辑 mp3 文件详细信息 (Delphi)

    我如何使用 delphi 编辑 mp3 文件详细信息 例如描述 标题 副标题 评级 艺术家 有什么组件可以做到这一点吗 谢谢 您也许不仅可以操作 ID3V1 还可以操作 ID3V2 所以 这个库可以帮助你 http www 3delite
  • JSON 对象被 Javascript 重新排序

    我有一个通过 PHP 生成的相当大的 JSON 对象 它从数据库中创建一个 PHP 对象 其键为整数 即 1 100 但这些键并不是按这个顺序排列的 它们是随机排列的 例如 55 72 5 8 14 32 64 等 然后我使用 json e
  • 如何在Java中重写数组的equals?

    我希望覆盖 int 数组的 equals 使得以下内容为真 int a 1 2 3 int b 1 2 3 System out println a equals b 有没有办法做到这一点 覆盖equals的方法int 既不可能 也没有必要
  • 在 Visual Studio 2012 中将新的异步/等待模式与 Windows 窗体设计器结合使用

    我正在尝试在 Visual Studio 2012 中使用新的 Async Await 模式实现异步调用 当我设置表单 使用表单设计器 然后尝试使用异步方法作为事件处理程序时 编译器会抱怨函数不返回 void 该方法应该返回一个任务 这就是
  • 在Python中合并具有不同文件名的CSV文件[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我对Python真的很陌生 所以这个问题可能有点基础 我有 44 个 csv 文件 它们具有相同的标题和不同的文件名 我想将它们全部合并到
  • 只从 URL 中获取域名?

    我正在尝试从 URL 字符串中提取域名 我几乎拥有它 我正在使用 URI 我有一个字符串 我的第一个想法是使用 Regex 但后来我决定使用 URI 类 我需要将上面的内容转换为 google com 和 google 而不带 www 我做
  • Flutter:定义自定义 TextStyles 以在整个应用程序中使用

    如何定义一小组自定义文本样式 然后可以在我的应用程序中重复使用它们 自定义文本样式应基于主题中定义的文本样式 我知道如何创建单独的 TextStyles 例如 Theme of context textTheme title copyWit
  • C++ 标准在哪里描述了指向原语的指针的转换?

    在优秀的博客文章中每个程序员都应该了解关于未定义行为的知识 http blog llvm org 2011 05 what every c programmer should know html 违反类型规则 部分说 将 int 转换为 f
  • Laravel PHPUnit 返回 404

    对于 Laravel API 我已经编写了测试用例 但每当我运行测试用例时 它总是失败并出现以下错误 1 Tests Feature CompanyTest orgTest Expected status code 200 but rece
  • Windows 上 R 包的 Conda 构建本地安装包

    我正在尝试在 Windows 上的 Conda 中构建自定义 R 包 源是本地 github 存储库 因为远程存储库是私有的 一切似乎都很顺利 但包最终大小为 9kb 并在构建时安装在本地计算机上 也就是说 上传到 Anaconda org
  • lambda 参数解包错误

    在 Python 2 中 这段代码没问题 f lambda m k m k m 1 2 3 4 k 5 6 7 8 print map f zip m k 但在Python 3中出现了以下错误 f lambda m k m k Syntax
  • C# 查找发件人

    private void buttonCheck object sender EventArgs e Type x sender GetType var y Activator CreateInstance x sends me back
  • Discord.js 与服务器机器人成员计数分开显示服务器用户计数

    我正在尝试为我的 Discord js 机器人创建一个 serverinfo 命令 我正在尝试将 Discord 服务器用户计数与服务器的机器人计数分开 我被告知要使用 filter但我不明白如何从用户计数中过滤机器人计数 好吧从guild
  • 获取当前 pthread cpu 使用率 Mac OS X

    在 Mac OS X 中如何从线程本身获取线程的 cpu 时间 对于linux 我所做的是getrusage RUSAGE THREAD ru 但此解决方案不适用于 Mac OS X 我遇到了这个question https stackov
  • 当我从文件读取地图时,Haskell 比 Python 需要更多的内存。为什么?

    我用Python编写了这个简单的代码 input open baseforms txt r encoding utf8 S for i in input words i split S update j words 0 for j in w
  • 为什么 System.Drawing.Bitmap 构造函数中的“stride”必须是 4 的倍数?

    我正在编写一个应用程序 需要我采用专有位图格式 MVTec Halcon HImage 并将其转换为 C 中的 System Drawing Bitmap 除了使用 获取指针 函数之外 提供给我的唯一可以帮助我执行此操作的专有函数涉及写入文