1 pièce(s) jointe(s)
[Tuto][LibTiffDelphi 3.7.0.00] Comment créer ses propres TIFFTag
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 :
Code:
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); |
Création des TAG personnels, ici un exemple avec de ll'ASCII, et des DOUBLE :
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):
Code:
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); |
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:
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 |
AsTiffTagViewer me donne ça :
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.
@+