完整24位真彩色位图灰度化源代码
2009-04-28 16:38
232 查看
From:http://hi.baidu.com/xets/blog/item/3f19c81f7ba3706bf724e476.html
BOOL JpegFile::BMP24to8(char *szSourceFile,char *szTargetFile)
{
HANDLE hSourceFile=INVALID_HANDLE_VALUE,hTargetFile=INVALID_HANDLE_VALUE;
DWORD dwSourceSize=0,dwTargetSize=0;
PBYTE pSource=NULL,pTarget=NULL;
hSourceFile=CreateFile(szSourceFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hSourceFile==INVALID_HANDLE_VALUE)
return FALSE;
dwSourceSize=GetFileSize(hSourceFile,NULL);
pSource=(PBYTE)VirtualAlloc(NULL,dwSourceSize,MEM_COMMIT,PAGE_READWRITE);
if(pSource==NULL||dwSourceSize<=54)//分配空间失败或者文件太小(BMP文件不可能小于54个字节)
{
CloseHandle(hSourceFile);
return FALSE;
}
DWORD dwTemp=0;
ReadFile(hSourceFile,pSource,dwSourceSize,&dwTemp,NULL);
BITMAPFILEHEADER *pSourceFileHeader=(BITMAPFILEHEADER*)pSource;
BITMAPINFOHEADER *pSourceInfoHeader=(BITMAPINFOHEADER*)(pSource+sizeof(BITMAPFILEHEADER));
if(pSourceFileHeader->bfType!=0x4d42||pSourceInfoHeader->biBitCount!=24)//不是BMP文件或者不是24位真彩色
{
CloseHandle(hSourceFile);
VirtualFree(pSource,NULL,MEM_RELEASE);
return FALSE;
}
CloseHandle(hSourceFile);
LONG nWidth=pSourceInfoHeader->biWidth;
LONG nHeight=pSourceInfoHeader->biHeight;
LONG nSourceWidth=nWidth*3;if(nSourceWidth%4) nSourceWidth=(nSourceWidth/4+1)*4;
LONG nTargetWidth=nWidth;if(nTargetWidth%4) nTargetWidth=(nTargetWidth/4+1)*4;
dwTargetSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256+nHeight*nTargetWidth;
pTarget=(PBYTE)VirtualAlloc(NULL,dwTargetSize,MEM_COMMIT,PAGE_READWRITE);
memset(pTarget,0,dwTargetSize);
if(pTarget==NULL)
{
VirtualFree(pTarget,NULL,MEM_RELEASE);
return FALSE;
}
BITMAPFILEHEADER *pTargetFileHeader=(BITMAPFILEHEADER *)pTarget;
BITMAPINFOHEADER *pTargetInfoHeader=(BITMAPINFOHEADER *)(pTarget+sizeof(BITMAPFILEHEADER));
pTargetFileHeader->bfType=pSourceFileHeader->bfType;
pTargetFileHeader->bfSize=dwTargetSize;
pTargetFileHeader->bfReserved1=0;
pTargetFileHeader->bfReserved2=0;
pTargetFileHeader->bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;
pTargetInfoHeader->biBitCount=8;//8
pTargetInfoHeader->biClrImportant=0;
pTargetInfoHeader->biClrUsed=256;
pTargetInfoHeader->biCompression=BI_RGB;
pTargetInfoHeader->biHeight=pSourceInfoHeader->biHeight;
pTargetInfoHeader->biPlanes=1;
pTargetInfoHeader->biSize=sizeof(BITMAPINFOHEADER);
pTargetInfoHeader->biSizeImage=nHeight*nTargetWidth;
pTargetInfoHeader->biWidth=pSourceInfoHeader->biWidth;
pTargetInfoHeader->biXPelsPerMeter=pSourceInfoHeader->biXPelsPerMeter;
pTargetInfoHeader->biYPelsPerMeter=pSourceInfoHeader->biYPelsPerMeter;
/*RGBQUAD *pRgb;
for(int i=0;i<pTargetInfoHeader->biClrUsed;i++)//初始化8位灰度图的调色板信息
{
pRgb=(RGBQUAD*)(pTarget+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+i*sizeof(RGBQUAD));
pRgb->rgbBlue=i;pRgb->rgbGreen=i;pRgb->rgbRed=i;pRgb->rgbReserved=0;
}*/
for (int m=0;m<nHeight;m++)//转化真彩色图为灰度图
{
for(int n=0;n<nWidth;n++)
{
if(pSource[pSourceFileHeader->bfOffBits+m*nSourceWidth+n*3]*0.114+pSource[pSourceFileHeader->bfOffBits+m*nSourceWidth+n*3+1]*0.587+pSource[pSourceFileHeader->bfOffBits+m*nSourceWidth+n*3+2]*0.299>127)
pTarget[pTargetFileHeader->bfOffBits+m*nTargetWidth+n]=255;
else
pTarget[pTargetFileHeader->bfOffBits+m*nTargetWidth+n]=0;
}
}
hTargetFile=CreateFile(szTargetFile,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
BOOL stat=WriteFile(hTargetFile,pTarget,dwTargetSize,&dwTemp,NULL);
CloseHandle(hTargetFile);
VirtualFree(pSource,NULL,MEM_RELEASE);
VirtualFree(pTarget,NULL,MEM_RELEASE);
return stat;
}
BOOL JpegFile::BMP24to8(char *szSourceFile,char *szTargetFile)
{
HANDLE hSourceFile=INVALID_HANDLE_VALUE,hTargetFile=INVALID_HANDLE_VALUE;
DWORD dwSourceSize=0,dwTargetSize=0;
PBYTE pSource=NULL,pTarget=NULL;
hSourceFile=CreateFile(szSourceFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(hSourceFile==INVALID_HANDLE_VALUE)
return FALSE;
dwSourceSize=GetFileSize(hSourceFile,NULL);
pSource=(PBYTE)VirtualAlloc(NULL,dwSourceSize,MEM_COMMIT,PAGE_READWRITE);
if(pSource==NULL||dwSourceSize<=54)//分配空间失败或者文件太小(BMP文件不可能小于54个字节)
{
CloseHandle(hSourceFile);
return FALSE;
}
DWORD dwTemp=0;
ReadFile(hSourceFile,pSource,dwSourceSize,&dwTemp,NULL);
BITMAPFILEHEADER *pSourceFileHeader=(BITMAPFILEHEADER*)pSource;
BITMAPINFOHEADER *pSourceInfoHeader=(BITMAPINFOHEADER*)(pSource+sizeof(BITMAPFILEHEADER));
if(pSourceFileHeader->bfType!=0x4d42||pSourceInfoHeader->biBitCount!=24)//不是BMP文件或者不是24位真彩色
{
CloseHandle(hSourceFile);
VirtualFree(pSource,NULL,MEM_RELEASE);
return FALSE;
}
CloseHandle(hSourceFile);
LONG nWidth=pSourceInfoHeader->biWidth;
LONG nHeight=pSourceInfoHeader->biHeight;
LONG nSourceWidth=nWidth*3;if(nSourceWidth%4) nSourceWidth=(nSourceWidth/4+1)*4;
LONG nTargetWidth=nWidth;if(nTargetWidth%4) nTargetWidth=(nTargetWidth/4+1)*4;
dwTargetSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256+nHeight*nTargetWidth;
pTarget=(PBYTE)VirtualAlloc(NULL,dwTargetSize,MEM_COMMIT,PAGE_READWRITE);
memset(pTarget,0,dwTargetSize);
if(pTarget==NULL)
{
VirtualFree(pTarget,NULL,MEM_RELEASE);
return FALSE;
}
BITMAPFILEHEADER *pTargetFileHeader=(BITMAPFILEHEADER *)pTarget;
BITMAPINFOHEADER *pTargetInfoHeader=(BITMAPINFOHEADER *)(pTarget+sizeof(BITMAPFILEHEADER));
pTargetFileHeader->bfType=pSourceFileHeader->bfType;
pTargetFileHeader->bfSize=dwTargetSize;
pTargetFileHeader->bfReserved1=0;
pTargetFileHeader->bfReserved2=0;
pTargetFileHeader->bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;
pTargetInfoHeader->biBitCount=8;//8
pTargetInfoHeader->biClrImportant=0;
pTargetInfoHeader->biClrUsed=256;
pTargetInfoHeader->biCompression=BI_RGB;
pTargetInfoHeader->biHeight=pSourceInfoHeader->biHeight;
pTargetInfoHeader->biPlanes=1;
pTargetInfoHeader->biSize=sizeof(BITMAPINFOHEADER);
pTargetInfoHeader->biSizeImage=nHeight*nTargetWidth;
pTargetInfoHeader->biWidth=pSourceInfoHeader->biWidth;
pTargetInfoHeader->biXPelsPerMeter=pSourceInfoHeader->biXPelsPerMeter;
pTargetInfoHeader->biYPelsPerMeter=pSourceInfoHeader->biYPelsPerMeter;
/*RGBQUAD *pRgb;
for(int i=0;i<pTargetInfoHeader->biClrUsed;i++)//初始化8位灰度图的调色板信息
{
pRgb=(RGBQUAD*)(pTarget+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+i*sizeof(RGBQUAD));
pRgb->rgbBlue=i;pRgb->rgbGreen=i;pRgb->rgbRed=i;pRgb->rgbReserved=0;
}*/
for (int m=0;m<nHeight;m++)//转化真彩色图为灰度图
{
for(int n=0;n<nWidth;n++)
{
if(pSource[pSourceFileHeader->bfOffBits+m*nSourceWidth+n*3]*0.114+pSource[pSourceFileHeader->bfOffBits+m*nSourceWidth+n*3+1]*0.587+pSource[pSourceFileHeader->bfOffBits+m*nSourceWidth+n*3+2]*0.299>127)
pTarget[pTargetFileHeader->bfOffBits+m*nTargetWidth+n]=255;
else
pTarget[pTargetFileHeader->bfOffBits+m*nTargetWidth+n]=0;
}
}
hTargetFile=CreateFile(szTargetFile,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
BOOL stat=WriteFile(hTargetFile,pTarget,dwTargetSize,&dwTemp,NULL);
CloseHandle(hTargetFile);
VirtualFree(pSource,NULL,MEM_RELEASE);
VirtualFree(pTarget,NULL,MEM_RELEASE);
return stat;
}
相关文章推荐
- 完整24位真彩色位图灰度化源代码
- 24位位图转4位彩色图(BMP)
- 24位真彩色转换为8位灰度图片(完整代码)
- 24位真彩色位图转换成8位灰度图片的代码实现
- 将24位真彩色位图保存为256色(8位)位图
- 24位真彩色转换为8位灰度图片(完整代码)
- 24位真彩色位图转换成8位灰度图片的代码实现
- 24位真彩色位图和8位灰度位图相互转换(C语言实现)
- 24位真彩色转换为8位灰度图片(完整代码)
- 24位真彩色转换为8位灰度图片(完整代码)
- C语言创建24位真彩色位图
- 在24位真彩色位图中插入文件并隐藏文件
- 24位真彩色转换为8位灰度图片(完整代码)
- 为什么24位位图(真彩色)的biSizeImage不等于(biWidth*biBitCount+31)/32*4*biHeight?
- 每天学一点flash(64) 彩色位图转换黑白照
- 24位 位图与32位 位图差异解析
- 24位转8位位图,不是灰度,有颜色的,尽量减少失真
- 图像编程学习笔记4——24位真彩色转换为灰度图像
- 轻松制作24位真彩色工具栏 (转)
- 24位位图转化为8位位图 位图头部信息BITMAPFILEHEADER BITMAPINFOHEADER修改代码