年终决定整理一下代码,第一部分图像的基本操作
说明:代码注重效率和高度可移植性,仅使用stdio.h库
参考例程,欢迎参考指正
int imread(char *filename, unsigned char color[1024],unsigned char *data,int size[2]) { FILE *fp; int i; int ct; unsigned char buf[4]; unsigned char bitHead[54]; if( size[4]%4 == 0) ct = 0; fp = fopen(filename,"rb"); if(fp == NULL) return -1; else{ fread(bitHead,1,54,fp); if(bitHead[28]==8) { ct = 4 - (size[0])%4; if( ct == 4) ct = 0; fread(color,1,1024,fp); for(i = 0; i < size[1]; i++) { fread(data,(size_t)size[0],1,fp); data = data + size[0]; fread(buf,ct,1,fp); } fclose(fp); return 0; } if(bitHead[28]==24) { ct = 4 - (3*size[0])%4; if( ct == 4) ct = 0; for(i = 0; i < size[1]; i++) { fread(data,3*size[0],1,fp); data = data + 3 * size[0]; fread(buf,ct,1,fp); } fclose(fp); return 0; } } } int imwrite(char* filename,unsigned char color[1024],unsigned char *data,int size[2]) { unsigned int isize ; int sizet,i,ct; unsigned char buf[4]; unsigned short head[27]; FILE* fp; ct = 4 - size[0]%4; if( size[4]%4 == 0) ct = 0; if(color[0]==204) { for(i=0;i<1024;i++) { if(i%4==3) color[i]=0xff; else color[i]=i/4; } color[396]=145;color[397]=44;color[398]=238; } if(size[0]%4) { sizet = 4*(int)(size[0]/4+1); } else { sizet = size[0]; } isize = sizet*size[1]+54+1024; head[0]=0x4D42; head[1]=isize%0x10000; head[2]=isize/0x10000; head[3]=0; head[4]=0; head[5]=0x436; head[6]=0; head[7]=0x28; head[8]=0; head[9]=size[0]%0x10000; head[10]=size[0]/0x10000; head[11]=size[1]%0x10000; head[12]=size[1]/0x10000; head[13]=0x1; head[14]=0x08; head[15]=0; head[16]=0; head[17]=0; head[18]=0; head[19]=0; head[20]=0; head[21]=0; head[22]=0; head[23]=0x100; head[24]=0; head[25]=0x100; head[26]=0; fp=fopen(filename,"wb"); if(!fp)return; fwrite(head,1,sizeof(head),fp); fwrite(color,1,1024,fp); for(i = 0; i < size[1]; i++) { fwrite(data,sizet,1,fp); data = data + size[0]; } fclose(fp); return 0; } int imsizeget(char *filename,int size[2],int *iscolor) { FILE *fp; unsigned char bitHead[54]; fp = fopen(filename,"rb"); if(fp == NULL) return -1; else{ fread(bitHead,1,54,fp); if(bitHead[0]=='B' && bitHead[1]=='M' && bitHead[26]==1 && bitHead[27]==0 && (bitHead[28] == 8 || bitHead[28]==24) && bitHead[29]==0) { size[0] = (((int)(bitHead[21]))<<8) + (((int)(bitHead[20]))<<8) + (((int)(bitHead[19]))<<8) + bitHead[18]; size[1] = (((int)(bitHead[25]))<<8) + (((int)(bitHead[24]))<<8) + (((int)(bitHead[23]))<<8) + bitHead[22]; if(bitHead[28] == 8) *iscolor = 0; else *iscolor = 1; fclose(fp); return 0; } else //位图不是八位单通道灰度图 { fclose(fp); return -2; } } } int rgb2gray(unsigned char *imagein,unsigned char *imageout,int size[2],int mod) { int i,j; for(i = 0; i < size[1]; i++) { for(j = 0; j < size[0]; j++) { if(mod==0) *(imageout + i * size[0] + j) = ( *(imagein + 3 * (i * size[0] + j) ) + *(imagein + 3 * (i * size[0] + j) + 1) + *(imagein + 3 * (i * size[0] + j) + 2) )/ 3; if(mod==1) *(imageout + i * size[0] + j) = *(imagein + 3 * (i * size[0] + j) + 2); if(mod==2) *(imageout + i * size[0] + j) = *(imagein + 3 * (i * size[0] + j) + 1); if(mod==3) *(imageout + i * size[0] + j) = *(imagein + 3 * (i * size[0] + j) ); } } return 0; } int imcopy(unsigned char *imagein,unsigned char *imageout,int size[2]) { int i,j; for(i=0; i<size[1]; i++) for(j=0; j<size[0]; j++) { *(imageout + i * size[0] + j) = *(imagein + i * size[0] + j); } return 0; } int main() { unsigned char *imagein = NULL; unsigned char *imageout = NULL; unsigned char color[1024]; int size[2]; int iscolor; imsizeget("1.bmp",size,&iscolor); imageout = (unsigned char *)calloc(size[0]*size[1],sizeof(unsigned char)); if(!iscolor) imagein = (unsigned char *)calloc(size[0]*size[1],sizeof(unsigned char)); else imagein = (unsigned char *)calloc(3*size[0]*size[1],sizeof(unsigned char)); imread("1.bmp",color,(unsigned char *)imagein,size); if(iscolor) rgb2gray(imagein,imageout,size,0); else imcopy(imagein,imageout,size); imwrite("0.bmp",color,(unsigned char *)imageout,size); free( imagein ); return 0; }