#include <windows.h> #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> #include <malloc.h> #define WIDTHBYTES(i) ((i+31)/32*4) //#pragma warning(disable: 4996) int main() { BITMAPFILEHEADER bf; //BMP文件头结构体 BITMAPINFOHEADER bi; //BMP信息头结构体 FILE* fp; //指向文件的指针 RGBQUAD *ipRGB; // DWORD LineByte,ImgSize; DWORD NumColors; unsigned char * * Imgdata; int i,j; char fileName[256]; //打开文件 printf("please enter filename:"); scanf("%s",fileName); fp=fopen(fileName,"rb"); if(fp == NULL){ printf("Open file error!"); exit(0); } //读取信息头、文件头 fread(&bf,sizeof(BITMAPFILEHEADER),1,fp); //把指针fp所指向的文件的头信息写入bf(地址) fread(&bi,sizeof(BITMAPINFOHEADER),1,fp); LineByte=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount); //计算位图的实际宽度并确保它为32的倍数 ImgSize=(DWORD)LineByte*bi.biHeight; if (bi.biClrUsed != 0 ) NumColors=(DWORD)bi.biClrUsed; else switch (bi.biBitCount) { case 1:NumColors=2;break; case 4:NumColors=16;break; case 8:NumColors=256;break; case 24:NumColors=0;break; } //分配调色板内存if(bi.biBitCount!=24){ ipRGB=(RGBQUAD *)malloc(NumColors*sizeof(RGBQUAD)); fread(ipRGB,sizeof(RGBQUAD),NumColors,fp); }Imgdata=new unsigned char*[bi.biHeight]; //声明一个指针数组if(bi.biBitCount==24){ fseek(fp, 4, SEEK_CUR);//sizeof(RGBQUAD) for ( i=(bi.biHeight)-1;i>=0;i--) Imgdata[i]=new unsigned char[bi.biWidth*3]; //每个数组元素也是一个指针数组 for ( i=(bi.biHeight)-1;i>=0;i--) for(j=0;j<bi.biWidth*3;j++) fread(&Imgdata[i][j],1,1,fp);//每次只读取一个1字节,存入数组 } else { for ( i=(bi.biHeight)-1;i>=0;i--) Imgdata[i]=new unsigned char[bi.biWidth]; //每个数组元素也是一个指针数组 for ( i=(bi.biHeight)-1;i>=0;i--) for(j=0;j<bi.biWidth;j++) fread(&Imgdata[i][j],1,1,fp);//每次只读取一个1字节,存入数组}fclose(fp); //写入另一个文件fp=fopen("mybmp.bmp","wb"); fwrite(&bf,sizeof(BITMAPFILEHEADER),1,fp); fwrite(&bi,sizeof(BITMAPINFOHEADER),1,fp); if(bi.biBitCount!=24){ fwrite(ipRGB,sizeof(RGBQUAD),NumColors,fp); for (i=(bi.biHeight)-1 ;i>=0;i--) for (j=0 ;j<bi.biWidth;j++) { Imgdata[i][j] = 255 - Imgdata[i][j]; fwrite(&Imgdata[i][j],1,1,fp); }}else{ for (i=(bi.biHeight)-1 ;i>=0;i--) for (j=0 ;j<bi.biWidth*3;j++) { Imgdata[i][j] = 255 - Imgdata[i][j]; fwrite(&Imgdata[i][j],1,1,fp); }}free(Imgdata); fclose(fp); return 0; }
相关资源:Labview 颜色识别