问题描述
- 数字图像平移函数 不理解
-
函数代码如下:/*************************************************************************
- 函数名称:Translation(LPSTR lpSrcStartBits, long lWidth, long lHeight, long lXOffset,
long lYOffset,long lLineBytes,long lDstLineBytes) - 函数参数:
- LPSTR lpSrcStartBits,指向源DIB起始像素的指针
- long lWidth,DIB图像的宽度
- long lHeight,DIB图像的高度
- long lXOffset,X方向偏移量
- long lYOffset,Y方向偏移量
- long lLineBytes,DIB图像的行字节数,为4的倍数
- long lDstLineBytes,临时DIB图像的行字节数,为4的倍数
- 函数类型:BOOL
- 函数功能:该函数用来平移DIB图像
************************************************************************/
BOOL Translation(LPSTR lpSrcStartBits, long lWidth, long lHeight,
long lXOffset, long lYOffset,long lLineBytes,long lDstLineBytes){
long i; //行循环变量
long j; //列循环变量
LPSTR lpSrcDIBBits; //指向源像素的指针
LPSTR lpDstDIBBits; //指向临时图像对应像素的指针
LPSTR lpDstStartBits; //指向临时图像对应像素的指针HLOCAL hDstDIBBits; //临时图像句柄
hDstDIBBits= LocalAlloc(LHND,lWidth * lDstLineBytes);// 分配临时内存
lpDstStartBits= (char * )LocalLock(hDstDIBBits);// 锁定内存
if (hDstDIBBits== NULL)// 判断是否内存分配return FALSE;// 分配内存失败
for(i = 0; i < lHeight; i++)// 行
{
for(j = 0; j < lWidth; j++) // 列
{
lpDstDIBBits=(char*)lpDstStartBits+lLineBytes*(lHeight-1-i)
+j;// 指向新DIB第i行,第j个像素的指针if( (j-lYOffset>= 0) && (j-lYOffset< lWidth) && // 像素在源DIB中的坐标j-lXOffset
(i-lXOffset>= 0) && (i-lXOffset < lHeight))// 判断是否在源图范围内
{
lpSrcDIBBits=(char )lpSrcStartBits+lLineBytes(lHeight-1-
(i-lXOffset))+(j-lYOffset);// 指向源DIB第i0行,第j0个像素的指针lpDstDIBBits= *lpSrcDIBBits;// 复制像素
}
else
{* ((unsigned char)lpDstDIBBits) = 255;// 源图中没有的像素,赋为255
}}
}
memcpy(lpSrcStartBits, lpDstStartBits, lLineBytes * lHeight);// 复制图像LocalUnlock(hDstDIBBits);// 释放内存
LocalFree(hDstDIBBits);return TRUE;
}
1.上述代码中分配临时内存时,内存大小为什么是lWidth * lDstLineBytes,不应该是lHeight * lDstLineBytes吗?
2.指向新DIB第i行,第j个像素的指针为什么是lpDstDIBBits=char*)lpDstStartBits+lLineBytes*(lHeight-1-i)
+j;// 指向新DIB第i行,第j个像素的指针对于每个像素是占8位时可以理解,如果每个像素不是占8位时就不好理解了?
有那位高手能帮忙解决上面两个问题,非常感谢! - 函数名称:Translation(LPSTR lpSrcStartBits, long lWidth, long lHeight, long lXOffset,