2019-08-24 13:06:51 +02:00
|
|
|
/*
|
|
|
|
* fimg-2gray.c
|
2022-07-11 06:12:25 +02:00
|
|
|
*
|
|
|
|
* This is a tricky job...
|
2019-08-24 13:06:51 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
2021-05-20 09:31:28 +02:00
|
|
|
#include <stdint.h>
|
2019-08-24 13:06:51 +02:00
|
|
|
#include <unistd.h>
|
|
|
|
#include "string.h"
|
|
|
|
|
|
|
|
#include "../floatimg.h"
|
|
|
|
|
|
|
|
extern int verbosity; /* must be declared around main() */
|
|
|
|
|
|
|
|
/* --------------------------------------------------------------------- */
|
|
|
|
/*
|
2020-04-02 14:49:10 +02:00
|
|
|
* floating resultat img MUST be allocated before calling this func.
|
2024-05-01 21:40:44 +02:00
|
|
|
* and MUST be of type 'gray image'.
|
2019-08-24 13:06:51 +02:00
|
|
|
*/
|
2020-01-10 14:18:38 +01:00
|
|
|
int fimg_mk_gray_from(FloatImg *src, FloatImg *dst, int k)
|
2019-08-24 13:06:51 +02:00
|
|
|
{
|
|
|
|
float kr, kg, kb, kdiv;
|
|
|
|
int nbb, foo;
|
|
|
|
|
2022-07-06 10:27:55 +02:00
|
|
|
if (k) {
|
|
|
|
/* some random funky values ... */
|
|
|
|
kr = 0.789; kg = 0.523; kb = 0.349;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
/* ... and canonic random values */
|
|
|
|
kr = kg = kb = 1.0;
|
|
|
|
}
|
2019-08-24 13:06:51 +02:00
|
|
|
kdiv = kr + kg + kb;
|
|
|
|
|
|
|
|
/* we must check the validity of our parameters */
|
|
|
|
if (FIMG_TYPE_RGB != src->type) {
|
|
|
|
fprintf(stderr, "%s : bad src type %d on %p\n", __func__,
|
|
|
|
src->type, src);
|
|
|
|
return -8;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (FIMG_TYPE_GRAY != dst->type) {
|
|
|
|
fprintf(stderr, "%s : bad dst type %d on %p\n", __func__,
|
|
|
|
dst->type, dst);
|
2024-05-01 21:40:44 +02:00
|
|
|
/* may be we can convert dst picture on the fly ? */
|
2019-08-24 13:06:51 +02:00
|
|
|
return -9;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* entering the main processing loop */
|
|
|
|
nbb = src->width * src->height;
|
|
|
|
for (foo=0; foo<nbb; foo++) {
|
|
|
|
dst->R[foo] = ( (src->R[foo] * kr) +
|
|
|
|
(src->G[foo] * kg) +
|
|
|
|
(src->B[foo] * kb) ) /
|
|
|
|
kdiv;
|
|
|
|
}
|
|
|
|
|
2019-08-26 02:35:17 +02:00
|
|
|
return 0;
|
2019-08-24 13:06:51 +02:00
|
|
|
}
|
|
|
|
/* --------------------------------------------------------------------- */
|
2020-12-20 12:43:08 +01:00
|
|
|
/* this function can work 'in place' */
|
2020-12-07 11:16:26 +01:00
|
|
|
int fimg_desaturate(FloatImg *src, FloatImg *dst, int notused)
|
2020-01-22 18:16:26 +01:00
|
|
|
{
|
|
|
|
int foo, nbb;
|
|
|
|
|
|
|
|
/* we must check the validity of our parameters */
|
2022-07-06 10:27:55 +02:00
|
|
|
if (notused) {
|
|
|
|
fprintf(stderr, "notused was %d, must be 0 in %s\n",
|
|
|
|
notused, __func__);
|
|
|
|
}
|
2020-01-22 18:16:26 +01:00
|
|
|
if (FIMG_TYPE_RGB != src->type || FIMG_TYPE_RGB != dst->type) {
|
2020-01-23 12:36:33 +01:00
|
|
|
fprintf(stderr, "%s : bad image type\n", __func__);
|
2020-01-22 18:16:26 +01:00
|
|
|
return -18;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* entering the main processing loop */
|
|
|
|
nbb = src->width * src->height;
|
|
|
|
for (foo=0; foo<nbb; foo++) {
|
|
|
|
dst->R[foo] = dst->G[foo] = dst->B[foo] =
|
|
|
|
(src->R[foo] + src->G[foo] + src->B[foo]) / 3.0;
|
|
|
|
}
|
|
|
|
|
2020-09-25 11:43:25 +02:00
|
|
|
return 0;
|
2020-01-22 18:16:26 +01:00
|
|
|
}
|
|
|
|
/* --------------------------------------------------------------------- */
|
2019-08-24 13:06:51 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|