使用memcpy时出现访问违例
本来是想要做中值滤波的
看到有人对8位位图做了一个中值滤波的程序,于是希望进行适当修改让其能够应付真彩色位图。。
在还进入中值滤波具体数据替换阶段前,该程序做了这样一件事情,首先根据位图的位数来计算位图每一行的像素应该占据的字节数,因为是16位,所以没有调色板,每一个像素应该是用RGB值直接表示,而且每一个分量应该要用到一个字节,那么也就是说每一行的每一个像素都要占3个字节,而由于BMP的像素数据区的存储方式规定:图像每一行所有的像素所占用的字节数应该是4的整数倍,于是我对原程序中每一行所占用的字节数的公式做出这样的修正:
lLineBytes = lWidth * 3 + (4 - (lWidth * 3) % 4) % 4; 其中lWidth为图像宽度。程序原来是“(((lWidth * 8) + 31) / 32 * 4)”
接着,该程序用hNewDIBBits = LocalAlloc(LHND, lLineBytes * lHeight)另外开辟了一段空间,为了保存滤波之后的图像,而不动源图像。接着用lpNewDIBBits = (char * )LocalLock(hNewDIBBits)拿到新空间的首位指针。。
下一步,它memcpy(lpNewDIBBits, lpDIBBits, lLineBytes * lHeight)把lpDIBBits(这个是指向源图像的指针)指向的图图内容copy到新开辟的空间里面去
但是,就是因为我改了上面那个1LineBytes的算式,于是这里就在我运行程序的时候给出了“访问违例”的提示。。
程序停在了下面给出的asm的倒数第二行
--------------------------------------------
CopyUp:
test edi,11b ;U - destination dword aligned?
jnz short CopyLeadUp ;V - if we are not dword aligned already, align
shr ecx,2 ;U - shift down to dword count
and edx,11b ;V - trailing byte count
cmp ecx,8 ;U - test if small enough for unwind copy
jb short CopyUnwindUp ;V - if so, then jump
-> rep movsd ;N - move all of our dwords //程序停在了这一行前
jmp dword ptr TrailUpVec[edx*4] ;N - process trailing bytes
--------------------------------------------
请问,可能有虾米原因不?