c# - 为什么 System.Drawing.Bitmap 构造函数中的 "stride"必须是 4 的倍数?

标签 c# constructor bitmap

我正在编写一个应用程序,要求我采用专有位图格式(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);

关于c# - 为什么 System.Drawing.Bitmap 构造函数中的 "stride"必须是 4 的倍数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2185944/

相关文章:

Android Canvas 使用位图撤消和重做

c# - 如何避免Windows崩溃屏幕

c# - WPF 任务管理器 : Handling Refreshing CPU Load Value?

constructor - F#在构造函数中调用成员函数

java - 在 Android 中以位图、jpeg 或 png 图像形式查看 PowerPoint XML

Android 内存不足问题

c# - 分区键的天蓝色存储大小超出范围?

c# - XSL-FO SVG 格式支持 - .Net

c++ - 构造函数生成

java - 构造函数不工作,稍后调用时不接受参数?