2 xwp460356102 xwp460356102 于 2013.07.21 16:57 提问

数字图像平移函数 不理解

函数代码如下:

/*************************************************************************

  • 函数名称: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位时就不好理解了?
有那位高手能帮忙解决上面两个问题,非常感谢!

Csdn user default icon
上传中...
上传图片
插入图片