diff --git a/.gitignore b/.gitignore index deb4039..60f208e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ lib/*.gif *.a gmon.out +cscope.out *.swp diff --git a/floatimg.h b/floatimg.h index b54ea05..fce4fa0 100644 --- a/floatimg.h +++ b/floatimg.h @@ -4,7 +4,7 @@ * http://la.buvette.org/photos/cumul */ -#define FIMG_VERSION 169 +#define FIMG_VERSION 170 /* * in memory descriptor @@ -154,6 +154,7 @@ int fimg_export_picture(FloatImg *pic, char *fname, int flags); int fimg_save_as_pnm(FloatImg *head, char *fname, int flags); int fimg_save_as_pgm(FloatImg *head, char *fname, int flags); int fimg_load_from_pnm(char *fname, FloatImg *head, int notused); +int fimg_save_plane_as_pgm(FloatImg *psrc, char *fname, char plane); double fimg_timer_set(int whot); double fimg_timer_get(int whot); @@ -222,6 +223,7 @@ int fimg_save_as_exr(FloatImg *src, char *outname, int flags); /* mathematics operations */ +float fimg_get_plane_maxvalue(FloatImg *psrc, char plane); float fimg_get_maxvalue(FloatImg *head); int fimg_get_minmax_rgb(FloatImg *head, float mmvals[6]); int fimg_meanvalues(FloatImg *head, float means[4]); diff --git a/lib/fimg-math.c b/lib/fimg-math.c index 0062e7c..365165b 100644 --- a/lib/fimg-math.c +++ b/lib/fimg-math.c @@ -16,6 +16,41 @@ extern int verbosity; /* must be declared around main() */ +/* ---------------------------------------------------------------- */ +/* nouveau 27 fevrier 2022 */ +float fimg_get_plane_maxvalue(FloatImg *psrc, char plane) +{ +float *ptrplane; +float maxval; +int area, foo; + +#if DEBUG_LEVEL +fprintf(stderr, ">>> %s ( %p '%c' )\n", __func__, psrc, plane); +#endif + +switch (plane) { + case 'r': case 'R': + ptrplane = psrc->R; break; + case 'g': case 'G': + ptrplane = psrc->G; break; + case 'b': case 'B': + ptrplane = psrc->B; break; + case 'a': case 'A': + ptrplane = psrc->A; break; + default: + fprintf(stderr, "%s: plane error\n", __func__); + abort(); break; + } + +area = psrc->width * psrc->height; +maxval = 0.0; + +for (foo=0; foo maxval) maxval = ptrplane[foo]; + } + +return maxval; +} /* ---------------------------------------------------------------- */ float fimg_get_maxvalue(FloatImg *head) { diff --git a/lib/fimg-pnm.c b/lib/fimg-pnm.c index 02dba78..58af3e2 100644 --- a/lib/fimg-pnm.c +++ b/lib/fimg-pnm.c @@ -83,6 +83,10 @@ return 0; } /* ---------------------------------------------------------------- */ +/* + * this func write the content of the R channel, the + * only one used by graylevel images + */ static void dump_gray_values(FILE *fp, FloatImg *picz, float fk) { int cnt, sz, value; @@ -112,7 +116,7 @@ int Rv, Gv, Bv; cnt = 0; sz = picz->width * picz->height; for (idx=0; idx 0) { + if (fk > 0) { /* why ? */ Rv = (int)(picz->R[idx] / fk); Gv = (int)(picz->G[idx] / fk); Bv = (int)(picz->B[idx] / fk); @@ -196,10 +200,60 @@ fputs("\n", fp); fclose(fp); return 0; } /* ---------------------------------------------------------------- */ +/* nouveau 27 fevrier 2022 */ +/* WARNING ! UGLY CODE INSIDE */ +int fimg_save_plane_as_pgm(FloatImg *psrc, char *fname, char plane) +{ +FILE *fp; +float maxval, fk, *ptrplane; +int area, idx, printed; + +#if DEBUG_LEVEL +fprintf(stderr, ">>> %s ( %p %s '%c' )\n", __func__, psrc, fname, plane); +#endif + +switch (plane) { + case 'r': case 'R': + ptrplane = psrc->R; break; + case 'g': case 'G': + ptrplane = psrc->G; break; + case 'b': case 'B': + ptrplane = psrc->B; break; + case 'a': case 'A': + ptrplane = psrc->A; break; + default: + fprintf(stderr, "%s: bad plane '%c'\n", __func__, plane); + abort(); break; + } + +if (NULL==(fp=fopen(fname, "w"))) { + perror(fname); + return -2; + } + +fprintf(fp, "P2\n%d\n%d\n65535\n\n", psrc->width, psrc->height); +area = psrc->width * psrc->height; +maxval = fimg_get_plane_maxvalue(psrc, plane); +fk = maxval / 65535.0; + +fprintf(stderr, "%s: maxval of %c = %f\n", __func__, plane, maxval); + +printed = 0; +for (idx=0; idx 72) { + fputs("\n", fp); + printed = 0; + } + } + +fclose(fp); + +return -1; +} +/* ---------------------------------------------------------------- */ /* nouveau 10 fevrier 2022 */ - - int fimg_save_as_pgm(FloatImg *src, char *fname, int flags) { FILE *fp; diff --git a/lib/t.c b/lib/t.c index 562c853..8c510af 100644 --- a/lib/t.c +++ b/lib/t.c @@ -14,6 +14,25 @@ int verbosity; +/* ---------------------------------------------------------------- */ +int essai_save_plane(int wot) +{ +int foo; +FloatImg image; + +fprintf(stderr, "-------- %s ( %d ) --------\n", __func__, wot); + +foo = fimg_create_from_dump("grabbed.fimg", &image); +if (foo) { + fprintf(stderr, "err loading picz\n"); + return -6; + } +foo = fimg_save_plane_as_pgm(&image, "red.pgm", 'r'); +foo = fimg_save_plane_as_pgm(&image, "green.pgm", 'g'); +foo = fimg_save_plane_as_pgm(&image, "blue.pgm", 'b'); + +return 0; +} /* ---------------------------------------------------------------- */ int essai_timer(int uuuh) { @@ -269,7 +288,7 @@ if (verbosity) { fimg_print_sizeof(); } -foo = essai_2gray(NULL, "quux"); +foo = essai_save_plane(0); fprintf(stderr, "retour essai -> %d\n", foo); // foo = essai_clone_et_copy(0);