Bibliothèque de traitements d'images en virgule flottante.
http://la.buvette.org/photos/cumul/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
3.4 KiB
157 lines
3.4 KiB
/* |
|
* INTERPOLATOR 2070 |
|
* |
|
* Don't use that software in real life ! |
|
* |
|
* imported in FloatImg Mon Nov 9 19:08:57 CET 2020 |
|
* |
|
*/ |
|
#include <stdio.h> |
|
#include <string.h> |
|
#include <stdlib.h> |
|
#include <unistd.h> |
|
#include <glob.h> |
|
|
|
#include "../floatimg.h" |
|
|
|
#include "glitches.h" |
|
#include "crapulator.h" |
|
|
|
// XXX #include "fonctions.h" |
|
|
|
int verbosity; |
|
int convert_to_gray; /* needed by fonctions.c */ |
|
|
|
/* -------------------------------------------------------------- */ |
|
int interpolator(char *pattern, char *outdir, int Nsteps) |
|
{ |
|
FloatImg A, B, Out, *pFirst, *pSecond; |
|
glob_t globbuf; |
|
int foo, idx, ipng, w, h, step; |
|
int iarray[3]; |
|
char *cptr, line[200]; |
|
float coef; |
|
|
|
fprintf(stderr, "\nfrom %s to %s with %d steps.\n", pattern, outdir, Nsteps); |
|
|
|
memset(&globbuf, 0, sizeof(glob_t)); |
|
foo = glob(pattern, 0, NULL, &globbuf); |
|
fprintf(stderr, "globbing '%s' -> %d, %ld files found\n", |
|
pattern, foo, globbuf.gl_pathc); |
|
|
|
if (0 == globbuf.gl_pathc) { |
|
fprintf(stderr, "%s : no file found, aborting\n", __func__); |
|
return -1; |
|
} |
|
|
|
foo = fimg_fileinfos(globbuf.gl_pathv[0], iarray); |
|
if (FIMG_TYPE_RGB != iarray[2]) { |
|
fprintf(stderr, "can work only on RGB fimg picture, was %d\n", |
|
iarray[2]); |
|
exit(1); |
|
} |
|
w = iarray[0], h = iarray[1]; |
|
fprintf(stderr, "first image size : %dx%d\n", w, h); |
|
|
|
fimg_create(&A, w, h, 3); pFirst = &A; |
|
fimg_create(&B, w, h, 3); pSecond = &B; |
|
fimg_create(&Out, w, h, 3); |
|
|
|
ipng = 0; |
|
for (idx=0; idx<globbuf.gl_pathc; idx++) { |
|
|
|
cptr = globbuf.gl_pathv[idx]; |
|
|
|
/* read the next file in B */ |
|
fprintf(stderr, "loading %s\r", cptr); |
|
foo = fimg_load_from_dump(cptr, &B); |
|
if (foo) { |
|
fprintf(stderr, "load #%d from dump -> %d\n", idx, foo); |
|
continue; |
|
} |
|
|
|
/* here, we can insert the input filter */ |
|
/* OK try it ... */ |
|
foo = crapulator(&B, 0, 256.7); |
|
if (foo) { |
|
fprintf(stderr, "crapulator failure %d\n", foo); |
|
exit(1); |
|
} |
|
|
|
for (step=0; step<Nsteps; step++) { |
|
coef = (float)step / (float)Nsteps; |
|
fimg_interpolate(pSecond, pFirst, &Out, coef); |
|
|
|
/* here we can insert the output filter */ |
|
kill_a_few_lines(&Out, 150.5, 5+(rand()%20)); |
|
|
|
sprintf(line, "%s/%05d.png", outdir, ipng); |
|
foo = fimg_save_as_png(&Out, line, 0); |
|
if (foo) { |
|
fprintf(stderr, "err saving %s\n", line); |
|
return -8; |
|
} |
|
ipng++; |
|
} |
|
|
|
#if 1 |
|
/* temporary hack : move datas */ |
|
fimg_copy_data(&B, &A); |
|
#else |
|
/* swap pointers to the two picz */ |
|
pTmp = pSecond; |
|
pSecond = pFirst; |
|
pFirst = pTmp; |
|
/* XXX THIS CODE DON'T WORK !!! */ |
|
#endif |
|
} |
|
|
|
fprintf(stderr, "generated %d png files\n", ipng); |
|
|
|
return 0; |
|
} |
|
/* -------------------------------------------------------------- */ |
|
void help(void) |
|
{ |
|
puts("\tINTERPOLATOR\noptions:"); |
|
|
|
/* may be we can make options incoherent, like |
|
* the options of 'fonderie' software ? |
|
*/ |
|
|
|
exit(0); |
|
} |
|
/* -------------------------------------------------------------- */ |
|
int main (int argc, char *argv[]) |
|
{ |
|
int foo; |
|
int nbrsteps = 9; |
|
int opt; |
|
|
|
fprintf(stderr, "*** %s : compiled by tTh, %s %s\n", __FILE__, |
|
__DATE__, __TIME__); |
|
fimg_print_version(2); |
|
|
|
while ((opt = getopt(argc, argv, "hv")) != -1) { |
|
switch(opt) { |
|
case 'h': help(); break; |
|
case 'v': verbosity++; break; |
|
} |
|
} |
|
|
|
/* TO BE CONTINUED *****/ |
|
|
|
if (4 != argc) { |
|
fprintf(stderr, "args: <in globpattern> <out dir> <nbrsteep>\n"); |
|
exit(1); |
|
} |
|
|
|
nbrsteps = atoi(argv[3]); |
|
|
|
foo = interpolator(argv[1], argv[2], nbrsteps); |
|
|
|
fprintf(stderr, "interpolator give a %d score\n", foo); |
|
|
|
return 0; |
|
} |
|
/* -------------------------------------------------------------- */
|
|
|