完整24位真彩色位图灰度化源代码

贴出来不为别的,就为万一以后硬盘出问题资料在网上还有个备份。

//Code By xets007
//转载请注明出处
//
////////////////////////////////////////////////////////////////////////
#include <windows.h>

BOOL BMP24to8(char *szSourceFile,char *szTargetFile);

int main(int argc,char* argv[])
{
BOOL stat=BMP24to8("c://source.bmp","c://target.bmp");//调用这个函数直接把24位真彩色灰度化
return 0;
}

BOOL 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;
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<256;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++)
   {
    pTarget[pTargetFileHeader->bfOffBits+m*nTargetWidth+n]=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;
   }
}
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;
}

石器时代32颜色。编译后只可以应用 #define _SASQL_C_ #include "version.h" #ifdef _MD5_MM #include "md5.h" #endif #ifdef _SASQL//新添加 #include "main.h" #include "sasql.h" #include MYSQL mysql; MYSQL_RES *mysql_result; MYSQL_ROW mysql_row; Config config; int AutoReg; static int readConfig( char *path ) { char buf[255]; FILE *fp; fp = fopen( path , "r" ); if( fp == NULL ){ return -2; } while( fgets( buf , sizeof( buf ) , fp )){ char command[255]; char param[255]; chop(buf); easyGetTokenFromString( buf , 1 , command , sizeof( command )); easyGetTokenFromString( buf , 2 , param , sizeof( param )); if( strcmp( command , "sql_IP" ) == 0 ){ strcmp( config.sql_IP , param ) ; snprintf( config.sql_IP , sizeof( config.sql_IP) , param ); printf("\n数据库地址: %s",config.sql_IP); #ifdef _MD5_MM }else if( strcmp( command , "sql_MD5" ) == 0 ){ config.sql_MD5 = atoi( param ); printf("\n帐号密码MD5加密: %s",config.sql_MD5?"YES":"NO"); #endif } else if( strcmp( command , "sql_Port" ) == 0 ){ config.sql_Port = atoi( param ); snprintf( config.sql_Port1 , sizeof( config.sql_Port1) , param ); printf("\n数据库端口: %d",config.sql_Port); } else if( strcmp( command , "sql_ID" ) == 0 ){ strcmp( config.sql_ID , param ) ; snprintf( config.sql_ID , sizeof( config.sql_ID) , param ); printf("\n数据库用户: %s",config.sql_ID); } else if( strcmp( command , "sql_PS" ) == 0 ){ strcmp( config.sql_PS , param ) ; snprintf( config.sql_PS , sizeof( config.sql_PS) , param ); printf("\n数据库密码: %s",config.sql_PS); } else if( strcmp( command , "sql_DataBase" ) == 0 ){ strcmp( config.sql_DataBase , param ) ; snprintf( config.sql_DataBase , sizeof( config.sql_DataBase) , param ); printf("\n登陆数据库名:%s",config.sql_DataB
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值