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
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
opencv 数字图象处理 图像平移变换
图像平移(Translation)变换是图像几何变换中最为简单的一种变换,是将一副图像中的所有像素都按照给定的偏移量在水平方向(沿x轴方向),或在垂直方向(沿y轴方向)移动。 void Translation(void) {//平移变换 值为正表示向轴正向移动,值为负表示向轴负向移动 cout<<"输入水平移动距离:"; int disx=0; cin>>disx; cout<<
数字图像处理--通过矩阵,简化操作(旋转,平移,缩放,切边....)
图像的一些操作,可以通过矩阵进行简化,例如,旋转,平移,缩放
Matlab图像的几何变换之图像平移
Matlab图像平移 代码如下: clc %清空命令窗口 I=rgb2gray(imread('DORMITORY.JPG'));%读入图片并转化为灰度图 figure,imshow(I); %建立窗口,显示灰度图I [r,c]=size(I); %
图像平移变换
vs实现《数字图像处理与机器视觉》一书中图像平移变换
图像处理 - 图像平移
初始坐标为(x0,y0)的点经过平移(tx,ty)(以向右,向下为正方向)后,坐标变为(x1,y1)。这两点之间的关系是x1=x0+tx ,y1=y0+ty。 以矩阵的形式表示为: 逆变换:   我们想知道的是平移后的图象中每个象素的颜色。例如我们想知道,新图中左上角点的RGB值是多少?很显然,该点是原图的某点经过平移后得到的,这两点的颜色肯定是一样的,所以只要知道
OpenCV数字图像处理(4) 平移
平移是最简单的一种变换,是将一幅图像上的所有点都被按照给定的偏移量在水平方向沿X轴、在垂直方向沿y轴移动
MATLAB 图像平移操作(转)
function outImage=immove(inImage,Tx,Ty)[m, n] = size(inImage);Tx=fix(Tx);Ty=fix(Ty);%move xif (TxinImage=imcrop(inImage,[abs(Tx),1,m-abs(Tx),n]);[m, n] = size(inImage);Tx=0; end%move yif (TyinImag
【VC图像处理】图像平移
#include "opencv2/core/core.hpp" #include"opencv2/highgui/highgui.hpp" #include #include "iostream" using namespace std; using namespace cv; void Translation(Mat img,Mat &outImg,int lxoffset,int lyoff
VC 图像几何变换、图像平移、垂直水平镜像、图像转置、图像缩放、图像旋转
实现灰度图像的几何变换、图像平移、垂直水平镜像、图像转置、图像缩放、图像旋转
【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程《数字图像处理》及课件进行讲解,主要通过MFC单文档视图实现显示BMP图片空间几何变换,包括图像平移、图形旋转、图像反转倒置镜像和图像缩放的知识。同时文章比较详细基础,没有采用GDI+获取矩阵,而是通过读取BMP图片信息头和矩阵像素实现变换,希望该篇文章对你有所帮助,尤其是初学者和学习图像处理的学生。