我正在编写一个应用程序,需要我采用专有位图格式(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(使用前将#替换为@)