数字图像平移函数 不理解

问题描述

数字图像平移函数 不理解

函数代码如下:

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

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

时间: 2024-11-03 06:29:11

数字图像平移函数 不理解的相关文章

归并排序-新手上路,链表学习中,问题是对功能函数不理解,问题已备注,请帮我在问题处写思路,尤其功能函数,谢谢!

问题描述 新手上路,链表学习中,问题是对功能函数不理解,问题已备注,请帮我在问题处写思路,尤其功能函数,谢谢! //第九章章末习题第10题#include//建立a b两链表包含学号成绩,把两个链表合并升序排列输出.求思路!#include#define LEN sizeof(struct student) struct student{ long num; int score; struct student * next; };struct student listalistb;int nsu

函数指针理解 看不明白

问题描述 函数指针理解 看不明白 typedef int (MainFunc) LDAP_P(( int argc char *argv[] ));extern MainFunc slapadd slapcat slapdn slapindex slappasswdslaptest slapauth slapacl slapschema;这个定义该怎么理解?谁可以讲讲. 解决方案 MainFunc被定义成指向某种函数的指针类型,后面一条语句是声明了多个这种指针类型的变量

kmp-KMP算法的next函数怎么理解?

问题描述 KMP算法的next函数怎么理解? 理解KMP关键在于理解next表,有些疑问需要各位帮忙, 网上资料(july的,阮一峰的)和书上(严书)资料已经看过, 希望网友能针对我的迷惑给些指点. 这里我有3个疑问:1) 怎么理解求取next[j+1]的过程,是模式串自己和自己匹配的过程. 我觉得这个好像是那么回事,但又感觉和一般的主串子串匹配不太一样,怎么理解自己和自己匹配?2)在求取上图中case2时,为什么第一次Pj和P[next[k]]比,而不是其他的数呢? 如果Pj和P[next[k

Python之路【3】:Python基础(二) 函数的理解

函数的理解 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 函数作用是你的程序有良好的扩展性.复用性. 同样的功能要是用3次以上的话就建议使用函数.   标注:不能死记, 函数可以理解为一个一个的功能块,你把一个大的功能拆分成一块一块的,用某项功能的时候就去调用某个功能块即可! 函数可以理解为:乐高积木,给你一块一块的,你可以用这些积木块组成你想要的任何,功能! 函数可以调用函数!主函数的作用就是把函数进行串联.调用!函数本身是不能自

C语言有这样的函数,,这个函数怎么理解,请大神指教

问题描述 C语言有这样的函数,,这个函数怎么理解,请大神指教 httpVar * httpdGetNextVariableByPrefix(curVar, prefix) httpVar *curVar; const char *prefix; { if (curVar) curVar = curVar->nextVariable; while (curVar) { if (strncmp(curVar->name, prefix, strlen(prefix)) == 0) return (

std-vc6 不带返回值函数 怎么理解

问题描述 vc6 不带返回值函数 怎么理解 #include #include using namespace std; fun() { return 1; } int j = sun(); system("pause"); return 0; } 解决方案 不带返回值的函数默认是返回int型 解决方案二: 你这个能编译通过?fun()里面带有return 1语句,应该要给一个返回类型吧,如果你不需要用到函数返回的结果值,你可以返回void,在devcpp中如果不加 返回类型,编译通不

javascript 匿名函数的理解(透彻版)_javascript技巧

复制代码 代码如下: (function(){ //这里忽略jQuery所有实现 })(); (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的第一眼,我就迷糊了.为什么只有一个匿 名函数又没看到运行(当然是运行了--),就能有jQuery这么个函数库了?于是,我抱着疑问来到CSDN.结果相信现在很多人都很清楚了(因为在我之 后也不乏来者,呵呵~).当一个匿名函数被括起来,然后

c-递归函数怎么理解呢?

问题描述 递归函数怎么理解呢? 例子 <?php function test( $n ) { echo $n.""  ""; if($n>0) test($n-1); else echo "" <--> ""; echo $n.""  ""; } test(10); ?> 输出: 10 9 8 7 6 5 4 3 2 1 0 <--> 0 1 2

C++编程中队内联函数的理解和使用_C 语言

函数调用过程c++经过编译生成可执行程序文件exe,存放在外存储器中.程序启动,系统从外存储器中将可执行文件装载到内存中,从入口地址(main函数起始处)开始执行.程序执行中遇到了对其他函数的调用,就暂停当前函数的执行,并保存下一条指令的地址作为从被调函数返回后继续执行的入口点,保存现场.然后转到被调函数的入口地址执行被调函数.遇到return语句或者被调函数结束后,恢复先前保存的现场,从先前保存的返回地址处继续执行主调函数的其余部分. 内联函数函数调用需要进行现场保护,以便在函数调用之后继续进