?? pgmimage.c
字號:
/* ****************************************************************** * HISTORY * 15-Oct-94 Jeff Shufelt (js), Carnegie Mellon University * Prepared for 15-681, Fall 1994. * ****************************************************************** */#include <stdio.h>#include <pgmimage.h>extern char *malloc();extern char *realloc();extern char *strcpy();char *img_basename(filename)char *filename;{ char *new, *part; int len, dex; len = strlen(filename); dex = len - 1; while (dex > -1) { if (filename[dex] == '/') { break; } else { dex--; } } dex++; part = &(filename[dex]); len = strlen(part); new = (char *) malloc ((unsigned) ((len + 1) * sizeof (char))); strcpy(new, part); return(new);}IMAGE *img_alloc(){ IMAGE *new; new = (IMAGE *) malloc (sizeof (IMAGE)); if (new == NULL) { printf("IMGALLOC: Couldn't allocate image structure\n"); return (NULL); } new->rows = 0; new->cols = 0; new->name = NULL; new->data = NULL; return (new);}IMAGE *img_creat(name, nr, nc)char *name;int nr, nc;{ int i, j; IMAGE *new; new = img_alloc(); new->data = (int *) malloc ((unsigned) (nr * nc * sizeof(int))); new->name = img_basename(name); new->rows = nr; new->cols = nc; for (i = 0; i < nr; i++) { for (j = 0; j < nc; j++) { img_setpixel(new, i, j, 0); } } return (new);}void img_free(img)IMAGE *img;{ if (img->data) free ((char *) img->data); if (img->name) free ((char *) img->name); free ((char *) img);}void img_setpixel(img, r, c, val)IMAGE *img;int r, c, val;{ int nc; nc = img->cols; img->data[(r * nc) + c] = val;}int img_getpixel(img, r, c)IMAGE *img;int r, c;{ int nc; nc = img->cols; return (img->data[(r * nc) + c]);}IMAGE *img_open(filename)char *filename;{ IMAGE *new; FILE *pgm; char line[512], intbuf[100], ch; int type, nc, nr, maxval, i, j, k, found; new = img_alloc(); if ((pgm = fopen(filename, "r")) == NULL) { printf("IMGOPEN: Couldn't open '%s'\n", filename); return(NULL); } new->name = img_basename(filename); /*** Scan pnm type information, expecting P5 ***/ fgets(line, 511, pgm); sscanf(line, "P%d", &type); if (type != 5 && type != 2) { printf("IMGOPEN: Only handles pgm files (type P5 or P2)\n"); fclose(pgm); return(NULL); } /*** Get dimensions of pgm ***/ fgets(line, 511, pgm); sscanf(line, "%d %d", &nc, &nr); new->rows = nr; new->cols = nc; /*** Get maxval ***/ fgets(line, 511, pgm); sscanf(line, "%d", &maxval); if (maxval > 255) { printf("IMGOPEN: Only handles pgm files of 8 bits or less\n"); fclose(pgm); return(NULL); } new->data = (int *) malloc ((unsigned) (nr * nc * sizeof(int))); if (new->data == NULL) { printf("IMGOPEN: Couldn't allocate space for image data\n"); fclose(pgm); return(NULL); } if (type == 5) { for (i = 0; i < nr; i++) { for (j = 0; j < nc; j++) { img_setpixel(new, i, j, fgetc(pgm)); } } } else if (type == 2) { for (i = 0; i < nr; i++) { for (j = 0; j < nc; j++) { k = 0; found = 0; while (!found) { ch = (char) fgetc(pgm); if (ch >= '0' && ch <= '9') { intbuf[k] = ch; k++; } else { if (k != 0) { intbuf[k] = '\0'; found = 1; } } } img_setpixel(new, i, j, atoi(intbuf)); } } } else { printf("IMGOPEN: Fatal impossible error\n"); fclose(pgm); return (NULL); } fclose(pgm); return (new);}int img_write(img, filename)IMAGE *img;char *filename;{ int i, j, nr, nc, k, val; FILE *iop; nr = img->rows; nc = img->cols; iop = fopen(filename, "w"); fprintf(iop, "P2\n"); fprintf(iop, "%d %d\n", nc, nr); fprintf(iop, "255\n"); k = 1; for (i = 0; i < nr; i++) { for (j = 0; j < nc; j++) { val = img_getpixel(img, i, j); if ((val < 0) || (val > 255)) { printf("IMG_WRITE: Found value %d at row %d col %d\n", val, i, j); printf(" Setting it to zero\n"); val = 0; } if (k % 10) { fprintf(iop, "%d ", val); } else { fprintf(iop, "%d\n", val); } k++; } } fprintf(iop, "\n"); fclose(iop); return (1);}IMAGELIST *imgl_alloc(){ IMAGELIST *new; new = (IMAGELIST *) malloc (sizeof (IMAGELIST)); if (new == NULL) { printf("IMGL_ALLOC: Couldn't allocate image list\n"); return(NULL); } new->n = 0; new->list = NULL; return (new);}void imgl_add(il, img)IMAGELIST *il;IMAGE *img;{ int n; n = il->n; if (n == 0) { il->list = (IMAGE **) malloc ((unsigned) (sizeof (IMAGE *))); } else { il->list = (IMAGE **) realloc ((char *) il->list, (unsigned) ((n+1) * sizeof (IMAGE *))); } if (il->list == NULL) { printf("IMGL_ADD: Couldn't reallocate image list\n"); } il->list[n] = img; il->n = n+1;}void imgl_free(il)IMAGELIST *il;{ free((char *) il->list); free((char *) il);}void imgl_load_images_from_textfile(il, filename)IMAGELIST *il;char *filename;{ IMAGE *iimg; FILE *fp; char buf[2000]; if (filename[0] == '\0') { printf("IMGL_LOAD_IMAGES_FROM_TEXTFILE: Invalid file '%s'\n", filename); return; } if ((fp = fopen(filename, "r")) == NULL) { printf("IMGL_LOAD_IMAGES_FROM_TEXTFILE: Couldn't open '%s'\n", filename); return; } while (fgets(buf, 1999, fp) != NULL) { imgl_munge_name(buf); printf("Loading '%s'...", buf); fflush(stdout); if ((iimg = img_open(buf)) == 0) { printf("Couldn't open '%s'\n", buf); } else { imgl_add(il, iimg); printf("done\n"); } fflush(stdout); } fclose(fp);}imgl_munge_name(buf)char *buf;{ int j; j = 0; while (buf[j] != '\n') j++; buf[j] = '\0';}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -