📄 ibgimage.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 + -