forked from tTh/FloatImg
one more step on the metadata road
This commit is contained in:
parent
4b64330884
commit
a5fac7effd
|
@ -68,6 +68,7 @@ tools/addpnm2fimg
|
|||
tools/cumulfimgs
|
||||
tools/fimgops
|
||||
tools/fimgfx
|
||||
tools/fimgmetadata
|
||||
tools/*.png
|
||||
tools/*.tiff
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
* http://la.buvette.org/photos/cumul
|
||||
*/
|
||||
|
||||
#define FIMG_VERSION 177
|
||||
#define FIMG_VERSION 179
|
||||
|
||||
/*
|
||||
* in memory descriptor
|
||||
|
@ -34,10 +34,13 @@ typedef struct {
|
|||
typedef struct {
|
||||
char magic[8];
|
||||
struct timeval timestamp;
|
||||
uint64_t pid; // WTF ?
|
||||
int32_t count;
|
||||
float fval;
|
||||
char idcam[32];
|
||||
int32_t origin; // enum ?
|
||||
uint32_t reserved[8];
|
||||
|
||||
} FimgMetaData;
|
||||
/*
|
||||
* we MUST look at packing and endianess problems NOW */
|
||||
|
@ -221,11 +224,15 @@ int fimg_vdeg_a(FloatImg *img, double dcoef);
|
|||
/* FIMG native file module */
|
||||
int fimg_fileinfos(char *fname, int *datas);
|
||||
int fimg_dump_to_file(FloatImg *head, char *fname, int notused);
|
||||
int fimg_dumpmd_to_file(FloatImg *fi, char *nm, FimgMetaData *pmd, int nu);
|
||||
|
||||
int fimg_load_from_dump(char *fname, FloatImg *where);
|
||||
int fimg_create_from_dump(char *fname, FloatImg *head);
|
||||
|
||||
/* FIMG metadata module */
|
||||
int fimg_show_metadata(FimgMetaData *pmd, char *title, int notused);
|
||||
int fimg_default_metadata(FimgMetaData *pmd);
|
||||
int fimg_get_metadata_from_file(char *fname, FimgMetaData *pmd);
|
||||
|
||||
int fimg_save_R_as_fits(FloatImg *src, char *outname, int flags);
|
||||
int fimg_save_G_as_fits(FloatImg *src, char *outname, int flags);
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
# Fimg tools
|
||||
|
||||
Need more explanations...
|
||||
|
|
@ -55,6 +55,7 @@ void fimg_print_sizeof(void)
|
|||
{
|
||||
fprintf(stderr, " sz FloatImg = %lu\n", sizeof(FloatImg));
|
||||
fprintf(stderr, " sz filehead = %lu\n", sizeof(FimgFileHead));
|
||||
fprintf(stderr, " sz metadata = %lu\n", sizeof(FimgMetaData));
|
||||
fprintf(stderr, " sz filter = %lu\n", sizeof(FimgFilter3x3));
|
||||
}
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
|
|
@ -59,7 +59,82 @@ return 0;
|
|||
}
|
||||
/* ---------------------------------------------------------------- */
|
||||
/*
|
||||
* /!\ thi func work ONLY on RGB image
|
||||
* new avril 2022 : trying to save metadatas...
|
||||
*/
|
||||
int fimg_dumpmd_to_file(FloatImg *fimg, char *fname, \
|
||||
FimgMetaData *pmd, int notused)
|
||||
{
|
||||
FILE *fp;
|
||||
int foo, nbre;
|
||||
FimgFileHead filehead;
|
||||
|
||||
#if 1 // DEBUG_LEVEL
|
||||
fprintf(stderr, ">>> %s ( %p '%s' %p %d )\n", __func__, fimg,
|
||||
fname, pmd, notused);
|
||||
#endif
|
||||
|
||||
if (FIMG_TYPE_RGB != fimg->type) {
|
||||
fprintf(stderr, "%s : bad type %d\n", __func__, fimg->type);
|
||||
return -8;
|
||||
}
|
||||
|
||||
fp = fopen(fname, "w");
|
||||
if (NULL==fp) {
|
||||
perror(fname);
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(&filehead, 0, sizeof(filehead));
|
||||
memcpy(filehead.magic, "FIMG", 4);
|
||||
filehead.w = fimg->width; filehead.h = fimg->height;
|
||||
filehead.t = fimg->type;
|
||||
|
||||
/* XXX metadata */
|
||||
if (NULL != pmd) {
|
||||
|
||||
filehead.magic[4] = 'a';
|
||||
}
|
||||
|
||||
foo = fwrite(&filehead, sizeof(FimgFileHead), 1, fp);
|
||||
if (1 != foo) {
|
||||
perror(fname);
|
||||
fclose(fp);
|
||||
/* may be here, we can remove the broken file ? */
|
||||
return -2;
|
||||
}
|
||||
|
||||
/* XXX metadata */
|
||||
if (NULL != pmd) {
|
||||
foo = fwrite(pmd, sizeof(FimgMetaData), 1, fp);
|
||||
if (1 != foo) {
|
||||
perror(fname);
|
||||
fclose(fp);
|
||||
/* may be here, we can remove the broken file ? */
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
|
||||
nbre = fimg->width * fimg->height; /* pixels per frame */
|
||||
foo = fwrite(fimg->R, sizeof(float), nbre, fp);
|
||||
if (nbre != foo) {
|
||||
perror(fname); fclose(fp); return -3;
|
||||
}
|
||||
foo = fwrite(fimg->G, sizeof(float), nbre, fp);
|
||||
if (nbre != foo) {
|
||||
perror(fname); fclose(fp); return -3;
|
||||
}
|
||||
foo = fwrite(fimg->B, sizeof(float), nbre, fp);
|
||||
if (nbre != foo) {
|
||||
perror(fname); fclose(fp); return -3;
|
||||
}
|
||||
|
||||
fclose(fp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* ---------------------------------------------------------------- */
|
||||
/*
|
||||
* /!\ this func work ONLY on RGB image
|
||||
*/
|
||||
int fimg_dump_to_file(FloatImg *fimg, char *fname, int notused)
|
||||
{
|
||||
|
@ -72,7 +147,7 @@ fprintf(stderr, ">>> %-25s ( %p '%s' %d )\n", __func__, fimg,
|
|||
fname, notused);
|
||||
#endif
|
||||
|
||||
if (3 != fimg->type) {
|
||||
if (FIMG_TYPE_RGB != fimg->type) {
|
||||
fprintf(stderr, "%s : bad type %d\n", __func__, fimg->type);
|
||||
return -8;
|
||||
}
|
||||
|
|
|
@ -12,34 +12,62 @@
|
|||
|
||||
extern int verbosity; /* must be declared around main() */
|
||||
|
||||
/* ---------------------------------------------------------------- */
|
||||
static void puts_magic_8(char *ptr, FILE *fp)
|
||||
{
|
||||
int foo;
|
||||
|
||||
fputs("magic = ", fp);
|
||||
fputc('[', fp);
|
||||
for (foo=0; foo<8; foo++) {
|
||||
fputc(ptr[foo], fp);
|
||||
}
|
||||
fputc(']', fp); fputc('\n', fp);
|
||||
fflush(fp);
|
||||
}
|
||||
/* ---------------------------------------------------------------- */
|
||||
int fimg_show_metadata(FimgMetaData *pmd, char *title, int notused)
|
||||
{
|
||||
int foo;
|
||||
|
||||
fprintf(stderr, ">>> %s ( %p '%s' 0x%08x )\n", __func__,
|
||||
pmd, title, notused);
|
||||
|
||||
fprintf(stderr, "sizeof metadata = %ld\n", sizeof(FimgMetaData));
|
||||
fprintf(stderr, "magic = '%8s'\n", pmd->magic);
|
||||
/* TIMESTAMP HERE */
|
||||
fprintf(stderr, "counter = %d\n", pmd->count);
|
||||
fprintf(stderr, "float value = %.3f\n", pmd->fval);
|
||||
fprintf(stderr, "id camera = '%s'\n", pmd->idcam);
|
||||
fprintf(stderr, "origin = %d\n", pmd->origin);
|
||||
if (verbosity) {
|
||||
fprintf(stderr, "sizeof(metadata) = %ld\n", \
|
||||
sizeof(FimgMetaData));
|
||||
puts_magic_8(pmd->magic, stderr);
|
||||
}
|
||||
|
||||
return -1;
|
||||
/* SHOW TIMESTAMP HERE */
|
||||
fprintf(stderr, "creator pid = %ld\n", pmd->pid);
|
||||
fprintf(stderr, "counter = %d\n", pmd->count);
|
||||
fprintf(stderr, "float value = %.3f\n", pmd->fval);
|
||||
fprintf(stderr, "id camera = '%s'\n", pmd->idcam);
|
||||
fprintf(stderr, "origin = 0x%x\n", pmd->origin);
|
||||
|
||||
fputs("reserved words are:\n ", stderr);
|
||||
for (foo=0; foo<8; foo++) {
|
||||
fprintf(stderr, " 0x%08x", pmd->reserved[foo]);
|
||||
if (3 == foo) fputs("\n ", stderr);
|
||||
}
|
||||
fputc('\n', stderr);
|
||||
return 0;
|
||||
}
|
||||
/* ---------------------------------------------------------------- */
|
||||
int fimg_default_metadata(FimgMetaData *pmd)
|
||||
{
|
||||
|
||||
memset(pmd, 0, sizeof(FimgMetaData));
|
||||
memcpy(pmd->magic, "metadata", 8);
|
||||
/* set timestamp here ? */
|
||||
pmd->pid = getpid();
|
||||
pmd->count = 0;
|
||||
pmd->fval = 255.0;
|
||||
strcpy(pmd->idcam, "<unknow>");
|
||||
pmd->origin = 999;
|
||||
pmd->origin = 0x55555555;
|
||||
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
/* ---------------------------------------------------------------- */
|
||||
int fimg_get_metadata_from_file(char *fname, FimgMetaData *pmd)
|
||||
|
@ -49,17 +77,18 @@ FimgFileHead filehead;
|
|||
FimgMetaData metadata;
|
||||
int foo;
|
||||
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, ">>> %s ( %s %p )\n", __func__, fname, pmd);
|
||||
#endif
|
||||
// #if DEBUG_LEVEL
|
||||
fprintf(stderr, ">>> %s ( '%s' %p )\n", __func__, fname, pmd);
|
||||
// #endif
|
||||
|
||||
if (NULL==(fp=fopen(fname, "r"))) {
|
||||
perror(fname);
|
||||
return -1;
|
||||
}
|
||||
|
||||
foo = fread(&filehead, sizeof(FimgFileHead), 1, fp);
|
||||
if (sizeof(FimgFileHead) != foo) {
|
||||
fprintf(stderr, "short read on %s (head)\n", fname);
|
||||
if (1 != foo) {
|
||||
fprintf(stderr, "short read (%d) on %s (head)\n", foo, fname);
|
||||
fclose(fp);
|
||||
return -2;
|
||||
}
|
||||
|
@ -71,13 +100,13 @@ if (memcmp(filehead.magic, "FIMG", 4)) {
|
|||
}
|
||||
|
||||
if ('a' != filehead.magic[4]) {
|
||||
fprintf(stderr, "'%s' have no metadata.\n", fname);
|
||||
fprintf(stderr, "file '%s' have no metadata.\n", fname);
|
||||
fclose(fp);
|
||||
return -4;
|
||||
}
|
||||
|
||||
foo = fread(&metadata, sizeof(FimgMetaData), 1, fp);
|
||||
if (sizeof(FimgMetaData) != foo) {
|
||||
if (1 != foo) {
|
||||
fprintf(stderr, "short read on %s (metadata)\n", fname);
|
||||
fclose(fp);
|
||||
return -5;
|
||||
|
@ -87,7 +116,6 @@ fclose(fp); /* got all needed datas */
|
|||
|
||||
if (memcmp(metadata.magic, "metadata", 8)) {
|
||||
fprintf(stderr, "'%s' invalid metadata.\n", fname);
|
||||
fclose(fp);
|
||||
return -6;
|
||||
}
|
||||
|
||||
|
|
11
lib/t.c
11
lib/t.c
|
@ -24,7 +24,12 @@ fprintf(stderr, "-------- %s ( %s ) --------\n", __func__, fname);
|
|||
|
||||
foo = fimg_default_metadata(&Md);
|
||||
|
||||
foo = fimg_show_metadata(&Md, "from t.c", 0);
|
||||
// foo = fimg_show_metadata(&Md, "default from t.c", 0);
|
||||
|
||||
foo = fimg_get_metadata_from_file(fname, &Md);
|
||||
fprintf(stderr, "%s : get metadata -> %d\n", fname, foo);
|
||||
|
||||
foo = fimg_show_metadata(&Md, fname, 0);
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
@ -85,7 +90,7 @@ int essai_interpolate(int k)
|
|||
FloatImg A, B, C;
|
||||
int foo, idx;
|
||||
char ligne[200];
|
||||
float fval, minmax[6];
|
||||
float fval;
|
||||
|
||||
foo = fimg_create(&A, WI, HI, FIMG_TYPE_RGB);
|
||||
if (foo) {
|
||||
|
@ -314,7 +319,7 @@ if (verbosity) {
|
|||
fimg_print_sizeof();
|
||||
}
|
||||
|
||||
foo = essai_metadata("foo.fimg");
|
||||
foo = essai_metadata("quux.fimg");
|
||||
fprintf(stderr, "retour essai -> %d\n", foo);
|
||||
|
||||
// foo = essai_save_plane(0);
|
||||
|
|
|
@ -13,8 +13,12 @@ DEPS = ../floatimg.h ../libfloatimg.a Makefile
|
|||
all: fimg2pnm mkfimg png2fimg fimgstats fimg2png \
|
||||
fimg2tiff fimg2text fimg2fits \
|
||||
addpnm2fimg cumulfimgs fimgops fimgfx \
|
||||
fimgmetadata \
|
||||
fimghalfsize
|
||||
|
||||
fimgmetadata: fimgmetadata.c $(DEPS)
|
||||
gcc $(COPT) $< ../libfloatimg.a -lm -o $@
|
||||
|
||||
fimgstats: fimgstats.c $(DEPS)
|
||||
gcc $(COPT) $< ../libfloatimg.a -lm -o $@
|
||||
|
||||
|
|
|
@ -10,7 +10,17 @@ Génération d'une image flottante avec des choses dedans.
|
|||
Un [../scripts/demo-mkfimg.sh](script) permet de créer toutes
|
||||
les images disponibles.
|
||||
|
||||
L'option `-m` rajoute des méta-données, cette option
|
||||
**ne** doit **pas** encore être utilisée dans la vrai vie.
|
||||
|
||||
## fimgops
|
||||
```
|
||||
usage:
|
||||
fimgops [options] A.fimg B.fimg operator D.fimg
|
||||
options:
|
||||
-k N.N set float value (def=0.500)
|
||||
-v increase verbosity
|
||||
```
|
||||
|
||||
## fimgfx
|
||||
|
||||
|
@ -22,7 +32,7 @@ effects:
|
|||
|
||||
Compute some useless numbers...
|
||||
|
||||
## fimg2pnm - fimg2png - fimg2tiff
|
||||
## fimg2pnm - fimg2png - fimg2tiff - fimg2fips
|
||||
|
||||
Exportation d'image flottante vers divers formats. Certains d'entre eux
|
||||
ne sont gérés que de façon très rudimentaire.
|
||||
|
@ -32,3 +42,6 @@ ne sont gérés que de façon très rudimentaire.
|
|||
Nouveau de l'année 2020+1 : exfiltrer toutes des données d'une image flottante
|
||||
afin de les rendre machinables.
|
||||
|
||||
## fimgmetadata
|
||||
|
||||
Nouveau avril 2022. Need more doc...
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
* FIMG METADATA TOOL
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "../floatimg.h"
|
||||
|
||||
int verbosity;
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
int get_print_metadata(char *fname, char *command)
|
||||
{
|
||||
int foo;
|
||||
FimgMetaData metadata;
|
||||
|
||||
// #if DEBUG_LEVEL
|
||||
fprintf(stderr, ">>> %s ( '%s' %s )\n", __func__, fname, command);
|
||||
// #endif
|
||||
|
||||
foo = fimg_get_metadata_from_file(fname, &metadata);
|
||||
if (foo) return foo;
|
||||
|
||||
/* switch on command here, please */
|
||||
|
||||
fimg_show_metadata(&metadata, fname, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* --------------------------------------------------------------------- */
|
||||
void help(void)
|
||||
{
|
||||
fprintf(stderr, "*** fimgmetadata (%s, %s)\n", __DATE__, __TIME__);
|
||||
fimg_print_version(1);
|
||||
exit(0);
|
||||
}
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
int foo, opt, nbargs;
|
||||
char *fname;
|
||||
|
||||
while ((opt = getopt(argc, argv, "hv")) != -1) {
|
||||
switch(opt) {
|
||||
case 'h': help(); break;
|
||||
case 'v': verbosity++; break;
|
||||
}
|
||||
}
|
||||
|
||||
nbargs = argc - optind;
|
||||
// fprintf(stderr, "nbargs = %d\n", nbargs);
|
||||
if (2 != nbargs) {
|
||||
fprintf(stderr, "%s need two args: command & filename\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
foo = get_print_metadata(argv[optind], argv[optind+1]);
|
||||
if (foo) fprintf(stderr, "got a %d from job\n", foo);
|
||||
|
||||
return 0;
|
||||
}
|
||||
/* --------------------------------------------------------------------- */
|
||||
|
|
@ -68,7 +68,7 @@ for (type = types; type->code; type++) {
|
|||
exit(0);
|
||||
}
|
||||
/* --------------------------------------------------------------------- */
|
||||
static void help(int lj)
|
||||
static void help(void)
|
||||
{
|
||||
int foo, cc;
|
||||
|
||||
|
@ -76,11 +76,11 @@ puts("Usage:\tmkfimg [options] quux.fimg width height");
|
|||
|
||||
puts("\t-k N.N\tgive a float parameter");
|
||||
puts("\t-L\tlist howto make a pic");
|
||||
fputs("\t-t bla\thowto make the pic :\n\t\t| ", stdout);
|
||||
fputs("\t-t bla\thowto make the pic :\n\t\t | ", stdout);
|
||||
|
||||
for (foo=cc=0; types[foo].code; foo++) {
|
||||
cc += printf("%s ", types[foo].name);
|
||||
if (cc>42) { cc=0; printf("\n\t\t| "); }
|
||||
if (cc>35) { cc=0; printf("\n\t\t | "); }
|
||||
}
|
||||
|
||||
puts("\n\t-v\tincrease verbosity");
|
||||
|
@ -100,14 +100,17 @@ int width, height;
|
|||
char *fname;
|
||||
float fvalue = 1.0;
|
||||
int type = T_BLACK;
|
||||
int wrmdata = 0;
|
||||
char *tname = "wtf?";
|
||||
|
||||
FloatImg fimg;
|
||||
FimgMetaData metadata;
|
||||
|
||||
while ((opt = getopt(argc, argv, "hk:Lt:v")) != -1) {
|
||||
while ((opt = getopt(argc, argv, "hk:Lmt:v")) != -1) {
|
||||
switch(opt) {
|
||||
case 'h': help(0); break;
|
||||
case 'h': help(); break;
|
||||
case 'k': fvalue = atof(optarg); break;
|
||||
case 'm': wrmdata = 1; break;
|
||||
case 't': type = get_type_by_name(tname=optarg);
|
||||
break;
|
||||
case 'L': list_types(); break;
|
||||
|
@ -147,8 +150,8 @@ switch (nbargs) {
|
|||
|
||||
fname = argv[optind];
|
||||
|
||||
if (verbosity>1) fprintf(stderr, "*** mkfimg *** %s %s\n",
|
||||
__DATE__, __TIME__);
|
||||
if (verbosity>1) fprintf(stderr, "*** mkfimg *** %s %s *** pid %ld\n",
|
||||
__DATE__, __TIME__, (long)getpid());
|
||||
if (verbosity) fprintf(stderr, "making '%s' %dx%d, type %d\n",
|
||||
fname, width, height, type);
|
||||
|
||||
|
@ -174,7 +177,18 @@ switch(type) {
|
|||
case -1: exit(1);
|
||||
}
|
||||
|
||||
foo = fimg_dump_to_file(&fimg, fname, 0);
|
||||
if (wrmdata) {
|
||||
fprintf(stderr, "%s: warning, metadata is bogus\n", argv[0]);
|
||||
(void)fimg_default_metadata(&metadata);
|
||||
sprintf(metadata.idcam, "mkfimg (libv %d)", FIMG_VERSION);
|
||||
foo = fimg_dumpmd_to_file(&fimg, fname, &metadata, 0);
|
||||
#if DEBUG_LEVEL
|
||||
fprintf(stderr, "save w. metadata -> %d\n", foo);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
foo = fimg_dump_to_file(&fimg, fname, 0);
|
||||
}
|
||||
if (foo) {
|
||||
fprintf(stderr, "dump fimg to %s -> %d\n", fname, foo);
|
||||
exit(1);
|
||||
|
|
Loading…
Reference in New Issue