D
deepfar
Unregistered / Unconfirmed
GUEST, unregistred user!
1.第一个
BOOL MirrorDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, BOOL bDirection,int nImageBits)
{
// 指向源图像的指针
LPSTR lpSrc;
// 指向要复制区域的指针
LPSTR lpDst;
// 指向复制图像的指针
LPSTR lpBits;
HLOCAL hBits;
// 循环变量
LONG i;
LONG j;
int nBits;//每像素占的位数
// 图像每行的字节数
LONG lLineBytes;
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth *nImageBits);
// 暂时分配内存,以保存一行图像
hBits = LocalAlloc(LHND, lLineBytes);
if (hBits == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpBits = (char * )LocalLock(hBits);
int nStep=nImageBits/8;
long lCenter=lWidth/2*nStep;
// 判断镜像方式
if (bDirection)
{
// 水平镜像
// 针对图像每行进行操作
for(i = 0; i < lHeight; i++)
{
// 针对每行图像左半部分进行操作
for(j = 0; j < lCenter; j+=nStep)
{
for(nBits=0;nBits<nStep;nBits++)
{
lpSrc = (char *)lpDIBBits + lLineBytes * i +lCenter- j+nBits;
lpDst = (char *)lpDIBBits + lLineBytes * i +lCenter+ j+nBits;
*lpBits = *lpDst;
*lpDst = *lpSrc;
*lpSrc = *lpBits;
}
}
}
}
else
{
// 垂直镜像
// 针对上半图像进行操作
for(i = 0; i < lHeight / 2; i++)
{
// 指向倒数第i行象素起点的指针
lpSrc = (char *)lpDIBBits + lLineBytes * i;
// 指向第i行象素起点的指针
lpDst = (char *)lpDIBBits + lLineBytes * (lHeight - i - 1);
// 备份一行,宽度为lWidth
memcpy(lpBits, lpDst, lLineBytes);
// 将倒数第i行象素复制到第i行
memcpy(lpDst, lpSrc, lLineBytes);
// 将第i行象素复制到倒数第i行
memcpy(lpSrc, lpBits, lLineBytes);
}
}
// 释放内存
LocalUnlock(hBits);
LocalFree(hBits);
// 返回
return TRUE;
}
2.第二个
void SaveBmpFile24(LPCSTR szFileName, BYTE* srcImage, LONG lWidth, LONG lHeight)
{
BITMAPFILEHEADER bfh = { NULL };
BITMAPINFOHEADER bih = { NULL };
LONG lImageSize = lHeight * WIDTHBYTES(lWidth * 24);
bfh.bfType = 0x4d42;
bfh.bfSize = lImageSize + sizeof(bfh) + sizeof(bih);
bfh.bfOffBits = sizeof(bfh) + sizeof(bih);
ContructBih(lWidth, lHeight, bih);
FILE* mFile = fopen(szFileName, "wb"
fwrite(&bfh, sizeof(bfh), 1, mFile);
fwrite(&bih, sizeof(bih), 1, mFile);
fwrite(srcImage, lImageSize, 1, mFile);
fclose(mFile);
}
void ContructBih(int nWidth, int nHeight, BITMAPINFOHEADER& bih)
{
bih.biSize = sizeof(bih);
bih.biWidth = nWidth;
bih.biHeight = nHeight;
bih.biPlanes = 1;
bih.biBitCount = 24;
bih.biCompression = BI_RGB;
bih.biSizeImage = nHeight * WIDTHBYTES(nWidth * 24);
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
bih.biClrUsed = 0;
bih.biClrImportant = 0;
}
请各位高手忙!谢谢!
BOOL MirrorDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight, BOOL bDirection,int nImageBits)
{
// 指向源图像的指针
LPSTR lpSrc;
// 指向要复制区域的指针
LPSTR lpDst;
// 指向复制图像的指针
LPSTR lpBits;
HLOCAL hBits;
// 循环变量
LONG i;
LONG j;
int nBits;//每像素占的位数
// 图像每行的字节数
LONG lLineBytes;
// 计算图像每行的字节数
lLineBytes = WIDTHBYTES(lWidth *nImageBits);
// 暂时分配内存,以保存一行图像
hBits = LocalAlloc(LHND, lLineBytes);
if (hBits == NULL)
{
// 分配内存失败
return FALSE;
}
// 锁定内存
lpBits = (char * )LocalLock(hBits);
int nStep=nImageBits/8;
long lCenter=lWidth/2*nStep;
// 判断镜像方式
if (bDirection)
{
// 水平镜像
// 针对图像每行进行操作
for(i = 0; i < lHeight; i++)
{
// 针对每行图像左半部分进行操作
for(j = 0; j < lCenter; j+=nStep)
{
for(nBits=0;nBits<nStep;nBits++)
{
lpSrc = (char *)lpDIBBits + lLineBytes * i +lCenter- j+nBits;
lpDst = (char *)lpDIBBits + lLineBytes * i +lCenter+ j+nBits;
*lpBits = *lpDst;
*lpDst = *lpSrc;
*lpSrc = *lpBits;
}
}
}
}
else
{
// 垂直镜像
// 针对上半图像进行操作
for(i = 0; i < lHeight / 2; i++)
{
// 指向倒数第i行象素起点的指针
lpSrc = (char *)lpDIBBits + lLineBytes * i;
// 指向第i行象素起点的指针
lpDst = (char *)lpDIBBits + lLineBytes * (lHeight - i - 1);
// 备份一行,宽度为lWidth
memcpy(lpBits, lpDst, lLineBytes);
// 将倒数第i行象素复制到第i行
memcpy(lpDst, lpSrc, lLineBytes);
// 将第i行象素复制到倒数第i行
memcpy(lpSrc, lpBits, lLineBytes);
}
}
// 释放内存
LocalUnlock(hBits);
LocalFree(hBits);
// 返回
return TRUE;
}
2.第二个
void SaveBmpFile24(LPCSTR szFileName, BYTE* srcImage, LONG lWidth, LONG lHeight)
{
BITMAPFILEHEADER bfh = { NULL };
BITMAPINFOHEADER bih = { NULL };
LONG lImageSize = lHeight * WIDTHBYTES(lWidth * 24);
bfh.bfType = 0x4d42;
bfh.bfSize = lImageSize + sizeof(bfh) + sizeof(bih);
bfh.bfOffBits = sizeof(bfh) + sizeof(bih);
ContructBih(lWidth, lHeight, bih);
FILE* mFile = fopen(szFileName, "wb"
fwrite(&bfh, sizeof(bfh), 1, mFile);
fwrite(&bih, sizeof(bih), 1, mFile);
fwrite(srcImage, lImageSize, 1, mFile);
fclose(mFile);
}
void ContructBih(int nWidth, int nHeight, BITMAPINFOHEADER& bih)
{
bih.biSize = sizeof(bih);
bih.biWidth = nWidth;
bih.biHeight = nHeight;
bih.biPlanes = 1;
bih.biBitCount = 24;
bih.biCompression = BI_RGB;
bih.biSizeImage = nHeight * WIDTHBYTES(nWidth * 24);
bih.biXPelsPerMeter = 0;
bih.biYPelsPerMeter = 0;
bih.biClrUsed = 0;
bih.biClrImportant = 0;
}
请各位高手忙!谢谢!