找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 5800|回复: 4

【C】将8位256色BMP图片黑白化的一个C语言程序

[复制链接]
发表于 2014-2-16 01:42:40 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
/****************************************************************************** 技术宅的结界:http://www.0xAA55.com/ 大家放心,我一定是按照最没有节操的方式编写的。相信这点难度是一定难不倒大家的。 我相信大家是一定能把它读懂的! 用法: BMPGRAY 输入文件.BMP 输出文件.BMP 注意输入文件必须是8位256色的BMP位图。嗯,就这些。 为了能让这个程序兼容DOS、c4droid等,我只让它输出英文信息,而且不包含windows.h ******************************************************************************/ #include<stdio.h> #include<malloc.h> typedef signed long LONG; typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned long DWORD; #pragma pack(push,1) typedef struct tagBITMAPFILEHEADER { WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffBits; }BITMAPFILEHEADER,*PBITMAPFILEHEADER; typedef struct tagBITMAPINFOHEADER { DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant; }BITMAPINFOHEADER,*PBITMAPINFOHEADER; typedef struct tagRGBQUAD { BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved; }RGBQUAD; #pragma pack(pop) RGBQUAD PALGray[256]={0}; RGBQUAD PALOrg[256]={0}; static char szReadFail[]="Unable to read data from %s\n"; static char szWriteFail[]="Write data to %s failed.\n"; int main(int argc,char **argv) { if(argc>2) {//参数个数必须是2个以上 FILE *fp1,*fp2; if(fp1=fopen(argv[1],"rb")) {//打开来源文件 BITMAPFILEHEADER BMFH; BITMAPINFOHEADER BMIF; if(fread(&BMFH,1,sizeof(BMFH),fp1)==sizeof(BMFH)) {//读取BMP文件头 if(BMFH.bfType==0x4D42) {//文件头标记必须是"BM" if(fread(&BMIF,1,sizeof(BMIF),fp1)==sizeof(BMIF)) {//读取BMP信息头 if(BMIF.biSize==sizeof(BMIF)) {//BMP信息头的大小必须是对的 if(BMIF.biBitCount==8) {//BMP必须为256色8位 if(fread(PALOrg,1,sizeof(PALOrg),fp1)==sizeof(PALOrg)) {//读取调色板 unsigned int i; WORD wAvr; for(i=0;i<256;i++) {//将调色板黑白化 wAvr=( PALOrg[i].rgbRed+ PALOrg[i].rgbGreen+ PALOrg[i].rgbBlue)/3;//取得调色板灰度 PALOrg[i].rgbRed= PALOrg[i].rgbGreen= PALOrg[i].rgbBlue=(BYTE)wAvr;//然后赋值 } if(fp2=fopen(argv[2],"wb")) {//打开目标文件准备写入 if(fwrite(&BMFH,1,sizeof(BMFH),fp2)==sizeof(BMFH)) {//写入BMP文件头 if(fwrite(&BMIF,1,sizeof(BMIF),fp2)==sizeof(BMIF)) {//写入BMP信息头 for(i=0;i<256;i++) PALGray[i].rgbRed= PALGray[i].rgbGreen= PALGray[i].rgbBlue=(BYTE)i;//建立灰度调色板 if(fwrite(PALGray,1,sizeof(PALGray),fp2)==sizeof(PALGray)) {//写入调色板 DWORD dwPitch=((BMIF.biWidth-1)/4+1)*4;//原图、目标图每行字节数 BYTE *pBits=(BYTE*)malloc(dwPitch);//分配内存准备操作 if(pBits) {//如果分配到了内存 if(BMIF.biHeight<0)//考虑到顶到下型位图 BMIF.biHeight=-BMIF.biHeight; for(i=0;i<BMIF.biHeight;i++) { if(fread(pBits,1,dwPitch,fp1)==dwPitch) { for(unsigned int x=0;x<BMIF.biWidth;x++) pBits[x]=PALOrg[pBits[x]].rgbRed;//根据亮度进行处理 if(fwrite(pBits,1,dwPitch,fp2)!=dwPitch) {//保存一行。 printf(szWriteFail,argv[2]); free(pBits); fclose(fp2); fclose(fp1); return 2; } } else { printf(szReadFail,argv[1]); free(pBits); fclose(fp2); fclose(fp1); return 2; } } free(pBits); fclose(fp2); fclose(fp1); return 0; } else { printf("No enough memory or %s is too wide.\n",argv[2]); fclose(fp2); fclose(fp1); return 2; } } else { printf(szWriteFail,argv[2]); fclose(fp2); fclose(fp1); return 2; } } else { printf(szWriteFail,argv[2]); fclose(fp2); fclose(fp1); return 2; } } else { printf(szWriteFail,argv[2]); fclose(fp2); fclose(fp1); return 2; } } else { printf(szWriteFail,argv[2]); fclose(fp1); return 2; } } else { printf(szReadFail,argv[1]); fclose(fp1); return 2; } } else { printf("%s is not a 8-bit BMP file.\n",argv[1]); fclose(fp1); return 2; } } else { printf("%s is not a valid BMP file.(BITMAPINFOHEADER)\n",argv[1]); fclose(fp1); return 2; } } else { printf(szReadFail,argv[1]); fclose(fp1); return 2; } } else { printf("%s is not a valid BMP file.(BITMAPFILEHEADER)\n",argv[1]); fclose(fp1); return 2; } } else { printf(szReadFail,argv[1]); fclose(fp1); return 2; } } else { printf(szReadFail,argv[1]); return 2; } } else { printf( "USAGE:\n" "BMPGRAY INPUT.BMP OUTPUT.BMP\n"); return 1; } }

本帖被以下淘专辑推荐:

回复

使用道具 举报

 楼主| 发表于 2014-2-16 01:51:04 | 显示全部楼层
那么,二楼放源码和可执行文件EXE。
把下面这张图下载保存之后把后缀改成ZIP就能解压得到源码。MinGW编译通过。
BMPGRAY.PNG
回复 赞! 靠!

使用道具 举报

 楼主| 发表于 2014-2-16 18:27:23 | 显示全部楼层
嗯,这才是真正的“面向过程”
看!缩进拳!
回复 赞! 靠!

使用道具 举报

发表于 2019-2-22 15:05:08 | 显示全部楼层
写成这样的缩进,会不会被老板打?
回复 赞! 靠!

使用道具 举报

发表于 2019-5-10 19:53:56 | 显示全部楼层
收藏收藏。
回复

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-22 17:15 , Processed in 0.034751 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表