mhs*_*mhs 2 image image-processing
我想使用CreateBitmapFromMemory方法,它需要步幅作为输入.而这个步伐使我困惑.
cbStride [in]
输入:UINT
pbBuffer中连续扫描行之间的字节数.
并且在这里它说:跨距=图像宽度+填充
这是怎么计算步幅的吧?
lWidthByte = (lWidth * bits + 7) / 8;
Run Code Online (Sandbox Code Playgroud)
lWidth→像素数
bits→每像素位数
我认为8的转换是转换为字节.但,
最后
cbStride =((lWidthByte + 3) / 4) * 4;
Run Code Online (Sandbox Code Playgroud)
请帮我清除这些.
填充的使用是由于各种(旧的和当前的)存储器布局优化.
使图像像素行具有4/8/16字节的整数倍的长度(以字节为单位)可以显着简化和优化许多基于图像的操作.原因是这些尺寸允许在CPU寄存器中进行适当的存储和并行像素处理,例如使用SSE/MMX,而不混合来自两个连续行的像素.
如果没有填充,则必须插入额外的代码来处理部分WORD/DWORD像素数据,因为内存中的两个连续像素可能指向一行右侧的一个像素和下一行的左侧像素.
如果您的图像是具有8位深度的单通道图像,即[0,255]范围内的灰度图像,那么步幅将是图像宽度四舍五入到最接近的4或8字节的倍数.请注意,即使像素可能具有多个字节深度,步长也总是以字节为单位指定.
对于具有更多通道和/或每像素/通道多于一个字节的图像,步幅将是以字节为单位的图像宽度四舍五入到最接近的4或8字节的倍数.
在+7和类似的算术例子,你给只需确保号码是否正确,因为四舍五入整数运算截断师的非整数部分.
只需插入一些数字,看看它是如何工作的.不要忘记截断(floor())中间分区结果.