⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 图像转置.txt

📁 数字图像处理技术源代码
💻 TXT
字号:
//参数说明 lpDIB 是指向以图像文件信息头开始的一段数据
//函数说明:该函数实现图像的转置功能
BOOL WINAPI TransposeDIB(LPSTR lpDIB)
{
	// 图像的宽度和高度
	LONG	lWidth;
	LONG	lHeight;
	// 指向源图像的指针
	LPSTR	lpDIBBits;
	// 指向源象素的指针
	LPSTR	lpSrc;
	// 指向转置图像对应象素的指针
	LPSTR	lpDst;
	// 指向转置图像的指针
	LPSTR	lpNewDIBBits;
	HLOCAL	hNewDIBBits;
	// 指向BITMAPINFO结构的指针(Win3.0)
	LPBITMAPINFOHEADER lpbmi;
	// 指向BITMAPCOREINFO结构的指针
	LPBITMAPCOREHEADER lpbmc;
	// 循环变量
	LONG	i;
	LONG	j;
	// 图像每行的字节数
	LONG lLineBytes;
	
	// 新图像每行的字节数
	LONG lNewLineBytes;
	// 获取指针
	lpbmi = (LPBITMAPINFOHEADER)lpDIB;
	lpbmc = (LPBITMAPCOREHEADER)lpDIB;
	// 找到源DIB图像象素起始位置
	lpDIBBits = ::FindDIBBits(lpDIB);
	// 获取图像的"宽度"(4的倍数)
	lWidth = ::DIBWidth(lpDIB);
	// 获取图像的高度
	lHeight = ::DIBHeight(lpDIB);
	// 计算图像每行的字节数
	lLineBytes = WIDTHBYTES(lWidth * 8);
	// 计算新图像每行的字节数
	lNewLineBytes = WIDTHBYTES(lHeight * 8);
	// 暂时分配内存,以保存新图像
	hNewDIBBits = LocalAlloc(LHND, lWidth * lNewLineBytes);
	// 判断是否内存分配失败
	if (hNewDIBBits == NULL)
	{
		// 分配内存失败
		return FALSE;
	}
	// 锁定内存
	lpNewDIBBits = (char * )LocalLock(hNewDIBBits);
	// 针对图像每行进行操作
	for(i = 0; i < lHeight; i++)
	{
		// 针对每行图像每列进行操作
		for(j = 0; j < lWidth; j++)
		{
			// 指向源DIB第i行,第j个象素的指针
			lpSrc = (char *)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
			// 指向转置DIB第j行,第i个象素的指针
			// 注意此处lWidth和lHeight是源DIB的宽度和高度,应该互换
			lpDst = (char *)lpNewDIBBits + lNewLineBytes * (lWidth - 1 - j) + i;
			
			// 复制象素
			*lpDst = *lpSrc;
		}
	}
	// 复制转置后的图像
	memcpy(lpDIBBits, lpNewDIBBits, lWidth * lNewLineBytes);
	
	// 互换DIB中图像的高宽
	if (IS_WIN30_DIB(lpDIB))
	{
		// 对于Windows 3.0 DIB
		lpbmi->biWidth = lHeight;
		
		lpbmi->biHeight = lWidth;
	}
	else
	{
		// 对于其它格式的DIB
		lpbmc->bcWidth = (unsigned short) lHeight;
		lpbmc->bcHeight = (unsigned short) lWidth;
	}
	
	// 释放内存
	LocalUnlock(hNewDIBBits);
	LocalFree(hNewDIBBits);
	// 返回
	return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -