Bonjour,
ces quelques lignes pour vous dire qu'il est possible de passer des données avec des TAGs perso dans un fichier Tiffgrace à la LibTiffDelphi V3.7.
Aucun problème avec les Tiff_tag standards de la norme Tiff :
Création des TAG personnels, ici un exemple avec de ll'ASCII, et des DOUBLE :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 cree_nom_fichier; // fabrique le nom du fichier de stockage // création d'un fichier Tiff Destination:=TIFFOpen(fichier_vid+'.TIF','w'); // création de la structure assert(Destination<>nil,'Impossible de créer le fichier TIFF'); .... //Champ TIFFTAG standards TIFFSetField(Destination,TIFFTAG_IMAGEWIDTH,iW); // champs taillle de l'image TIFFSetField(Destination,TIFFTAG_IMAGELENGTH,iH); TIFFSetField(Destination,TIFFTAG_BITSPERSAMPLE,8); // champ niveaux de gris 8 => 256 niveaux de gris TIFFSetField(Destination,TIFFTAG_SAMPLESPERPIXEL,3); // champ échantillonnage 3=> 3 octets par pixel TIFFSetField(Destination,TIFFTAG_ROWSPERSTRIP,iH); // champ taille de bande (facilite la lecture des grandes images). Ici 1 bande = 1 ligne TIFFSetField(Destination,TIFFTAG_COMPRESSION,COMPRESSION_NONE); // champ de compression (surtout pas de compression !) TIFFSetField(Destination,TIFFTAG_PHOTOMETRIC,PHOTOMETRIC_RGB); // système colorimétrique TIFFSetField(Destination,TIFFTAG_PLANARCONFIG,PLANARCONFIG_CONTIG); TIFFSetField(Destination,TIFFTAG_RESOLUTIONUNIT,RESUNIT_CENTIMETER);// resolution de l'image TIFFSetField(Destination,TIFFTAG_XRESOLUTION,resolution); TIFFSetField(Destination,TIFFTAG_YRESOLUTION,resolution);
Juste après le TIFFOpen, j'ajoute mes tags au dictionnaire (il faut le refaire à chaque sollicitation du TiffOpen, car le dictionnaire n'est pas global, il est lié au tiff sur lequel il pointe):
Notez que la longueur des champs passé est TIFF_VARIABLE pour de l'ascii (chaine à 0 terminal à passer avec un Pchar). Pour les tags non ASCIII, il est indispensable d'utiliser TIFFSetField en mode passage de la longueur (et donc avec FieldPassCount à True, euh... à 1), je n'ai pas réussi avec le mode standard d'appel de TIFFSetField.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 // création des tags propres with xtiffFieldInfo[0] do begin FieldTag:=$D000; FieldReadCount:=TIFF_VARIABLE; FieldWriteCount:=TIFF_VARIABLE; FieldType:=TIFF_ASCII; FieldBit:=FIELD_CUSTOM; FieldOkToChange:=1; FieldPassCount:=0; FieldName:=Pchar('EssaiTexte'); end; with xtiffFieldInfo[1] do begin FieldTag:=$D001; FieldReadCount:=1; FieldWriteCount:=1; FieldType:=TIFF_DOUBLE; FieldBit:=FIELD_CUSTOM; FieldOkToChange:=1; FieldPassCount:=1; FieldName:=Pchar('ExposureTime'); end; with xtiffFieldInfo[2] do begin FieldTag:=$D002; FieldReadCount:=1; FieldWriteCount:=1; FieldType:=TIFF_DOUBLE; FieldBit:=FIELD_CUSTOM; FieldOkToChange:=1; FieldPassCount:=1; FieldName:=Pchar('FocalLength'); end; TIFFMergeFieldInfo(destination,@xtiffFieldInfo,3);
AsTiffTagViewer me donne ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 // custom fields spécifiques ch:='Camera n°'+Cam_serial; TIFFSetField(Destination,$D000,PChar(ch)); longueur:=1; new(Pexposition); Pexposition^:=1.2345; TIFFSetField(Destination,$D001,longueur,Pexposition); // exposition new(Pfocale); Pfocale^:=6.7891011; TIFFSetField(Destination,$D002,longueur,Pfocale); // focale
ImageWidth (1 Short): 1280
ImageLength (1 Short): 1024
BitsPerSample (3 Short): 8, 8, 8
Compression (1 Short): Uncompressed
Photometric (1 Short): RGB
StripOffsets (1 Long): 8
SamplesPerPixel (1 Short): 3
RowsPerStrip (1 Short): 1024
StripByteCounts (1 Long): 3932160
XResolution (1 Rational): 100,199996948242
YResolution (1 Rational): 100,199996948242
PlanarConfig (1 Short): Contig
ResolutionUnit (1 Short): Centimeter
Software (10 ASCII): RJLab5#12
53248 (18 ASCII): Camera n°20003776
53249 (1 Double):
53250 (1 Double):
Les deux derniers tags ne sont pas interprétés par le Viewer, mais il ne faut pas s'inquiéter, ça marche quand même.
Le tag 53250 est vu par le viewer comme "54 F3 66 1E 0A 28 1B 40".
C'est bien confirmé par la trace CPU dit que c'est stocké dans la mémoire comme tel (voir image jointe).
En toute rigueur, dans le Tiff, il faudrait créer un subdirectory propre à l'application et y coller ses tags perso, mais j'ai choisi de les mettre dans le root car mon appli est scientifique et les fichiers ne seront exploités que par des logiciels dédiés.
Voilà, j'espère que ça pourra servir à d'autres.
@+
Partager