《Visual C++实践与提高—数字图像处理与工程应用篇》第五章学习笔记
时间:2025-04-03
时间:2025-04-03
这是本人学习《Visual C++实践与提高—数字图像处理与工程应用篇》这本书时做的笔记。该书由高守传 姚领田等编著。中国铁道出版社出版
第五章 图像的几何变换
数字图像平移 图像平移函数
/************************************************************************* * 函数名称: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))// 判断是否在源图范围内
这是本人学习《Visual C++实践与提高—数字图像处理与工程应用篇》这本书时做的笔记。该书由高守传 姚领田等编著。中国铁道出版社出版
}
}
}
{
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;
该函数调用函数CDImagePorcess View视图类的 //图像平移
void CDImageProcessView::OnTranslation() { // TODO: Add your command handler code here CDImageProcessDoc* pDoc = GetDocument(); //////////////////////////////////////////////////////////////////////////////////////////////// 回
long lSrcLineBytes; //图象每行的字节数 long lSrcWidth; //图象的宽度和高度 long lSrcHeight; LPSTR lpSrcDib; //指向源图象的指针 LPSTR lpSrcStartBits; //指向源像素的指针 long lDstLineBytes; //新图象每行的字节数
lpSrcDib= (LPSTR) ::GlobalLock((HGLOBAL) pDoc->GetHObject());// 锁定DIB if (pDoc->m_dib.GetColorNum(lpSrcDib) != 256)// 判断是否是8-bpp位图 { AfxMessageBox("对不起,不是256色位图!");// 警告 ::GlobalUnlock((HGLOBAL) pDoc->GetHObject());// 解除锁定 return; //返回 } //判断是否是8-bpp位图,不是则返
lpSrcStartBits=pDoc->m_dib.GetBits(lpSrcDib); // 找到DIB图象像素起始位置
lSrcWidth= pDoc->m_dib.GetWidth(lpSrcDib); // 获取图象的宽度
lSrcHeight= pDoc->m_dib.GetHeight(lpSrcDib); // 获取图象的高度
这是本人学习《Visual C++实践与提高—数字图像处理与工程应用篇》这本书时做的笔记。该书由高守传 姚领田等编著。中国铁道出版社出版
lSrcLineBytes=pDoc->m_dib.GetReqByteWidth(lSrcWidth * 8); // 计算图象每行的字节数
///////////////////////////////////////////////////////////////////////////////////////////////// 数 }
lDstLineBytes=pDoc->m_dib.GetReqByteWidth(lSrcHeight * 8); // 计算新图象每行的字节
CDlgTran TranPara;// 创建对话框
if (TranPara.DoModal() != IDOK)// 显示对话框,提示用户设定量 return;
int temver=TranPara.m_verOff; int temhor=TranPara.m_horOff;
if (Translation(lpSrcStartBits, lSrcWidth,lSrcHeight,// 调用Translation()函数平移DIB temver,temhor,lSrcLineBytes,lDstLineBytes)) {
pDoc->SetModifiedFlag(TRUE); pDoc->UpdateAllViews(NULL); ::GlobalUnlock((HGLOBAL) pDoc->GetHObject()); } else {
AfxMessageBox(_T("分配内存失败!")); }//警告
// 设置脏标记
// 更新视图
// 解除锁定
数字图像旋转 图像旋转函数
/************************************************************************* * 函数名称:Rotate(LPSTR lpSrcDib, LPSTR lpSrcStartBits,long lWidth, long lHeight, long lLineBytes, WORD palSize, long lDstWidth, long lDstHeight,long lDstLineBytes,float fSina, float fCosa) * 函数参数:
* LPSTR lpSrcDib,指向源DIB的指针
* LPSTR lpSrcStartBits,指向源DIB的起始像素的指针 * long lWidth,源DIB图象宽度 * long lHeight,源DIB图象高度
* long lLineBytes,源DIB图象字节宽度(4的倍数) * WORD palSize,源DIB图象调色板大小 * long lDstWidth,目标图象宽度
上一篇:开关电源磁性元件2
下一篇:广东农业与农村发展现状