⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ibgimage.c

📁 有限元学习研究用源代码(老外的),供科研人员参考
💻 C
字号:
/* last edit: Ilja Schmelzer -------------- 13-OCT-1994 17:19:22.69	*/
#include <stdio.h>
#include "ibg.h"       
#include "ibgimage.h"       
 
ibgImage ibgImageAlloc(unsigned lx, unsigned ly, unsigned colorOn)
{ibgImage p = (ibgImage)malloc(sizeof(struct ibgImage0));
 ibgImageLx(p) = lx;
 ibgImageLy(p) = ly;
 ibgColorOn(p) = colorOn;
 if(colorOn){
  	p->r = (char*)malloc(lx*ly);
	p->g = (char*)malloc(lx*ly);
	p->b = (char*)malloc(lx*ly);
 }else{
  	p->r = p->g = p->b = (char*)malloc(lx*ly);
 }
 return p;
}

int	 ibgImageFree(ibgImage picture)
{
 free(picture->r);
 if(ibgColorOn(picture)){
	free(picture->g);
 	free(picture->b);
 }
 free(picture);
 return ibgSuccess;
}

static int getnumber(FILE *file)
/* 
   assumes that a positive number follows. Reads and returns this number.
   Returns -1 for other characters, -2 for EOF.
   # as comment up to the end of line is allowed
*/
{char cc;
 int n;
beg:
 cc = fgetc(file);
 if(feof(file)) return -2;
 if(cc=='#'){
	do{
		cc=fgetc(file); 
		if(feof(file)) return -2;
	}while((cc != '\n'));
	goto beg; 
 }
 if((cc==' ')||(cc=='\t')||(cc=='\n')) goto beg;
 n = 0;
 do{
	if((cc<'0')||(cc>'9')){
		if((cc==' ')||(cc=='\t')||(cc=='\n')) return n;
		return -1;
	}
	n *= 10; n += cc-'0';
	cc = fgetc(file);
	if(feof(file)) return n;
 }while(n<100000);
 return n;	
}


ibgImage ibgImageLoad(char *filename)
{ibgImage p;
 int  i,j,k,l,lx,ly,c,bytes,rest,fac,col,rc,c1,n;
 char c0,cf,*cc;
 FILE* file = fopen(filename,"r");
 if(file==NULL){
	fprintf(stderr,"image file %s not found\n",filename);
  	return ibgNULL;
 }
 c0 = fgetc(file);
 cf = fgetc(file);
 if((c0 != 'P')||(cf < '1') || (cf > '6')){
/* to include other graphic formats describing a true color picture
   include here some other text reading this file format and go to colormap
*/
	fprintf(stderr,"image file %s has unknown format\n",filename);
	fprintf(stderr,"use f.e. xv to convert into PPM format\n");
  	return ibgNULL;
 }
 if((lx=getnumber(file)) < 0){
	fprintf(stderr,"error reading image file %s\n",filename);
  	return ibgNULL;
 }
 if((ly=getnumber(file)) < 0){
	fprintf(stderr,"error reading image file %s\n",filename);
  	return ibgNULL;
 }
 l  = lx*ly;
 switch(cf){
 case '1':
	p = ibgImageAlloc(lx,ly,ibgFalse);
	for(i=0;i<l;i++){
		n = getnumber(file);
		if(n>0){
			p->r[i] = 0;
		}else if(n==0){
			p->r[i] = ibgImageMax;
		}else{
			goto error;
		}
	}
	break;
 case '2':
	p = ibgImageAlloc(lx,ly,ibgFalse);
	col = getnumber(file);
	if(col>ibgImageMax) goto error;
	if(col<ibgImageMax){
		fac = ((ibgImageMax+1)/(col+1));
		for(i=0;i<l;i++){
			n = getnumber(file);
			if(n>=0){
			       	p->r[i] = n*fac;
			}else{
				goto error;
			}
		}
	}else{
		for(i=0;i<l;i++){
			n = getnumber(file);
			if(n>=0){
			       	p->r[i] = n*fac;
			}else{
				goto error;
			}
		}
	}
	break;
 case '3':
	p = ibgImageAlloc(lx,ly,ibgTrue);
	col = getnumber(file);
	if(col>ibgImageMax){ 
		goto error;
	}else if(col<ibgImageMax){fac = ((ibgImageMax+1)/(col+1));
		for(i=0;i<l;i++){
			if((p->r[i] = getnumber(file)*fac) < 0) goto error;
			if((p->g[i] = getnumber(file)*fac) < 0) goto error;
			if((p->b[i] = getnumber(file)*fac) < 0) goto error;
		}
	}else{
		for(i=0;i<l;i++){
			if((p->r[i] = getnumber(file)) < 0) goto error;
			if((p->g[i] = getnumber(file)) < 0) goto error;
			if((p->b[i] = getnumber(file)) < 0) goto error;
		}
	}
	break;
 case '4':
	p = ibgImageAlloc(lx,ly,ibgFalse);
	bytes = l/8;
	rest  = l%8; c = 0;
	cc = (char*) malloc(bytes+8);
	rc = fread(cc,1,bytes+1,file);
	for(i=0;i<bytes;i++){
	       	c1 = cc[i]; k=128;
	 	for(j=0;j<8;j++){
			if(c1 & k ){
			      	p->r[c] = 0;
			}else{
			      	p->r[c] = ibgImageMax;
			}
			c++; k /= 2;
		}
	}
	c1 = cc[bytes]; k = 128;
 	for(j=0;j<rest;j++){
			if(c1 & k ){
			      	p->r[c] = 0;
			}else{
			      	p->r[c] = ibgImageMax;
			}
			c++; k /= 2;
	}
	free(cc);
	break;
 case '5':
	p = ibgImageAlloc(lx,ly,ibgFalse);
	col = getnumber(file);
	if(col > ibgImageMax) goto error;
	rc = fread(p->r,1,l,file);
	if(col < ibgImageMax){
		fac = (ibgImageMax+1) / (col+1);
	      	for(i=0;i<l;i++){
			p->r[i] *= fac;
		}
	}
	break;
 case '6':
	p = ibgImageAlloc(lx,ly,ibgTrue);
	col = getnumber(file);
	if(col > ibgImageMax) goto error;
	if(col < ibgImageMax){fac = (ibgImageMax+1) / (col+1);
	      	for(i=0;i<l;i++){
			p->r[i] = fgetc(file)*fac;
			p->g[i] = fgetc(file)*fac;
			p->b[i] = fgetc(file)*fac;
		}
	}else{
	      	for(i=0;i<l;i++){
			p->r[i] = fgetc(file);
			p->g[i] = fgetc(file);
			p->b[i] = fgetc(file);
		}
	}
	break;
 }
 fclose(file);
 return p;
error:
 fprintf(stderr,"error reading image file %s\n",filename);
 ibgImageFree(p);
 fclose(file);
 return ibgNULL;
}

int	 ibgImageSave(ibgImage p, char *filename, int format)
{int i,l;
 FILE* file = fopen(filename,"w");
 if(file==NULL){
	fprintf(stderr,"unpossible to open image file %s\n",filename);
  	return ibgError;
 }
 l = ibgImageLx(p)*ibgImageLy(p);
 switch(format){
 case ibgImageFormatPBW:
	/* currently not implemented - use gray instead */
 case ibgImageFormatPGray:
	fprintf(file,"P2\n%d %d\n",ibgImageLx(p),ibgImageLy(p));
	fprintf(file,"%d\n",ibgImageMax);
	for(i=0;i<l;i++){
		fprintf(file,"%d\n",p->r[i]);
	}
	break;
 case ibgImageFormatPColor:
	fprintf(file,"P3\n%d %d\n",ibgImageLx(p),ibgImageLy(p));
	fprintf(file,"%d\n",ibgImageMax);
	for(i=0;i<l;i++){
		fprintf(file,"%d ", p->r[i]);
		fprintf(file,"%d ", p->g[i]);
		fprintf(file,"%d\n",p->b[i]);
	}
	break;
 case ibgImageFormatPBWRaw:
	/* currently not implemented - use gray instead */
 case ibgImageFormatPGrayRaw:
	fprintf(file,"P5\n%d %d\n",ibgImageLx(p),ibgImageLy(p));
	fprintf(file,"%d\n",ibgImageMax);
	for(i=0;i<l;i++){
		fputc(p->r[i],file);
	}
	break;
 case ibgImageFormatPColorRaw:
	fprintf(file,"P6\n%d %d\n",ibgImageLx(p),ibgImageLy(p));
	fprintf(file,"%d\n",ibgImageMax);
	for(i=0;i<l;i++){
		fputc(p->r[i],file);
		fputc(p->g[i],file);
		fputc(p->b[i],file);
	}
	break;
 }
 fclose(file);
 return ibgSuccess; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -