现在的位置: 首页 > 综合 > 正文

C语言处理图像基本操作1400(读入、拷贝、写出图像及彩色图转灰度图)

2018年11月06日 ⁄ 综合 ⁄ 共 3397字 ⁄ 字号 评论关闭

年终决定整理一下代码,第一部分图像的基本操作

说明:代码注重效率和高度可移植性,仅使用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;
}


抱歉!评论已关闭.