xwp460356102 2013-07-21 08:57 采纳率: 0%
浏览 932

数字图像平移函数 不理解

函数代码如下:

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

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

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 三菱伺服电机按启动按钮有使能但不动作
    • ¥20 为什么我写出来的绘图程序是这样的,有没有lao哥改一下
    • ¥15 js,页面2返回页面1时定位进入的设备
    • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
    • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
    • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
    • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
    • ¥20 腾讯企业邮箱邮件可以恢复么
    • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
    • ¥15 错误 LNK2001 无法解析的外部符号