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