年终决定整理一下代码,第一部分图像的基本操作
说明:代码注重效率和高度可移植性,仅使用stdio.h库
博客已转移至个人网站(http://www.p-chao.com)
参考例程,欢迎参考指正
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;
}