📄 图像转置.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 + -