Subversion Repositories eFlore/Applications.cel

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1149 gduche 1
<?php
1198 jpm 2
// declare(encoding='UTF-8');
3
/**
4
 * Script de migration des Images de la version 1 de la base de données du CEL à la v2.
5
 *
6
 * @category	php 5.2
7
 * @package		Cel/Scripts
8
 * @author		Aurélien PERONNET <aurelien@tela-botanica.org>
9
 * @author		Jean-Pascal MILCENT <jpm@tela-botanica.org>
10
 * @copyright	Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org)
11
 * @license	http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL
12
 * @license	http://www.gnu.org/licenses/gpl.html Licence GNU-GPL
13
 * @version	$Id$
14
 */
1149 gduche 15
class MigrationImages extends Cel {
1189 jpm 16
 
1198 jpm 17
	const dry_run = false;
1160 aurelien 18
	const truncate = true; //Doit on vider les tables de destination ?
1149 gduche 19
	const separateur_champs_metadonnees = ';';
20
	const separateur_valeurs_metadonnees = ':';
1189 jpm 21
 
1198 jpm 22
	public static $bdd_cel_migration;
23
	public static $bdd_utilisateurs;
24
	private $cle_id_metadonnees = array();
25
	private $tableau_utilisateurs = array();
26
	private $tableau_observations = array();
27
	private $tableau_mots_cles = array();
1189 jpm 28
 
1149 gduche 29
	/** Tableau associatif permettant de stocker l'avancement dans une boucle.
30
	* La clé est un md5 du message à afficher au démarrage de la boucle.
31
	* @var array
32
	*/
33
	private static $avancement = array();
1189 jpm 34
 
35
	private $tableau_nouveau_ancien = array(
1149 gduche 36
		'id_image' => 'ci_id_image',
37
		'ordre' =>'ci_ordre',
38
		'ce_utilisateur' => 'traiterIdentifiantUtilisateur',
39
		'prenom_utilisateur' => 'traiterPrenomUtilisateur',
40
		'nom_utilisateur' => 'traiterNomUtilisateur',
41
		'courriel_utilisateur' => 'ci_ce_utilisateur',
42
		'hauteur' => 'ci_meta_height',
43
		'largeur' => 'ci_meta_width',
44
		'appareil_fabriquant' => 'ci_meta_make',
45
		'appareil_modele' => 'ci_meta_model',
46
		'date_prise_de_vue' => 'ci_meta_date_time',
1198 jpm 47
		'note_qualite' => 'traiterNoteImage',
48
		'mots_cles_texte' => 'ci_meta_mots_cles',
1149 gduche 49
		'commentaire' => 'ci_meta_comment',
50
		'nom_original' => 'ci_nom_original',
51
		'md5' => 'ci_md5',
52
		'meta_exif' => 'traiterExif',
53
		'meta_iptc' => 'traiterIptc',
54
		'meta_xmp' => 'traiterXmp',
55
		'meta_makernote' => 'traiterMakernote',
56
		'date_modification' => 'ci_meta_date',
57
		'date_creation' => 'ci_meta_date_ajout'
58
	);
1189 jpm 59
 
1149 gduche 60
	private $champs_exifs_non_gardes = array(
61
		'ci_meta_x_resolution',
62
		'ci_meta_y_resolution',
63
		'ci_meta_gps',
64
		'ci_meta_user_comment',
65
		'ci_meta_exif_exposure_time',
66
		'ci_meta_exif_f_number',
67
		'ci_meta_exif_exif_version',
68
		'ci_meta_exif_compressed_bits_per_pixel',
69
		'ci_meta_exif_shutter_speed_value',
70
		'ci_meta_exif_aperture_value',
71
		'ci_meta_exif_exposure_bias_value',
72
		'ci_meta_exif_max_aperture_value',
73
		'ci_meta_exif_metering_mode',
74
		'ci_meta_exif_light_source',
75
		'ci_meta_exif_flash',
76
		'ci_meta_exif_focal_length',
77
		'ci_meta_exif_flash_pix_version',
78
		'ci_meta_exif_color_space',
79
		'ci_meta_exif_interoperability_offset',
80
		'ci_meta_exif_focal_plane_x_resolution',
81
		'ci_meta_exif_focal_plane_y_resolution',
82
		'ci_meta_exif_focal_plane_resolution_unit',
83
		'ci_meta_exif_sensing_method',
84
		'ci_meta_exif_file_source',
85
		'ci_meta_exif_custom_rendered',
86
		'ci_meta_exif_exposure_mode',
87
		'ci_meta_exif_white_balance',
88
		'ci_meta_exif_digital_zoom_ratio',
89
		'ci_meta_exif_scene_capture_type',
90
		'ci_meta_exif_gain_control',
91
		'ci_meta_exif_contrast',
92
		'ci_meta_exif_saturation',
93
		'ci_meta_exif_sharpness',
94
		'ci_meta_exif_subject_distance_range'
95
	);
1189 jpm 96
 
1149 gduche 97
	private $champs_iptc_non_gardes = array(
98
		'ci_meta_iptc_category',
99
		'ci_meta_iptc_by_line',
100
		'ci_meta_iptc_by_line_title',
101
		'ci_meta_iptc_city',
102
		'ci_meta_iptc_sub_location',
103
		'ci_meta_iptc_province_state',
104
		'ci_meta_iptc_country_primary_location_code',
105
		'ci_meta_iptc_country_name',
106
		'ci_meta_iptc_headline',
107
		'ci_meta_iptc_credit',
108
		'ci_meta_iptc_copyright_notice',
109
		'ci_meta_iptc_contact'
110
	);
1189 jpm 111
 
1149 gduche 112
	private $champs_divers_non_gardes = array(
113
		'ci_publiable_eflore',
114
		'ci_meta_mots_cles'
115
	);
1189 jpm 116
 
1198 jpm 117
	private $ids_tags_exif = array(
118
		'InteropIndex' => array('id' => '1', 'tag' => 'InteropIndex', 'categorie' => 'InteropIFD'),
119
		'InteropVersion' => array('id' => '2', 'tag' => 'InteropVersion', 'categorie' => 'InteropIFD'),
120
		'ProcessingSoftware' => array('id' => '11', 'tag' => 'ProcessingSoftware', 'categorie' => 'IFD0'),
121
		'SubfileType' => array('id' => '254', 'tag' => 'SubfileType', 'categorie' => 'IFD0'),
122
		'OldSubfileType' => array('id' => '255', 'tag' => 'OldSubfileType', 'categorie' => 'IFD0'),
123
		'ImageWidth' => array('id' => '256', 'tag' => 'ImageWidth', 'categorie' => 'IFD0'),
124
		'ImageLength' => array('id' => '257', 'tag' => 'ImageHeight', 'categorie' => 'IFD0'),
125
		'BitsPerSample' => array('id' => '258', 'tag' => 'BitsPerSample', 'categorie' => 'IFD0'),
126
		'Compression' => array('id' => '259', 'tag' => 'Compression', 'categorie' => 'IFD0'),
127
		'PhotometricInterpretation' => array('id' => '262', 'tag' => 'PhotometricInterpretation', 'categorie' => 'IFD0'),
128
		'Thresholding' => array('id' => '263', 'tag' => 'Thresholding', 'categorie' => 'IFD0'),
129
		'CellWidth' => array('id' => '264', 'tag' => 'CellWidth', 'categorie' => 'IFD0'),
130
		'CellLength' => array('id' => '265', 'tag' => 'CellLength', 'categorie' => 'IFD0'),
131
		'FillOrder' => array('id' => '266', 'tag' => 'FillOrder', 'categorie' => 'IFD0'),
132
		'DocumentName' => array('id' => '269', 'tag' => 'DocumentName', 'categorie' => 'IFD0'),
133
		'ImageDescription' => array('id' => '270', 'tag' => 'ImageDescription', 'categorie' => 'IFD0'),
134
		'Make' => array('id' => '271', 'tag' => 'Make', 'categorie' => 'IFD0'),
135
		'Model' => array('id' => '272', 'tag' => 'Model', 'categorie' => 'IFD0'),
136
		'StripOffsets' => array('id' => '273', 'tag' => 'StripOffsets', 'categorie' => 'IFD0'),
137
		'Orientation' => array('id' => '274', 'tag' => 'Orientation', 'categorie' => 'IFD0'),
138
		'SamplesPerPixel' => array('id' => '277', 'tag' => 'SamplesPerPixel', 'categorie' => 'IFD0'),
139
		'RowsPerStrip' => array('id' => '278', 'tag' => 'RowsPerStrip', 'categorie' => 'IFD0'),
140
		'StripByteCounts' => array('id' => '279', 'tag' => 'StripByteCounts', 'categorie' => 'IFD0'),
141
		'MinSampleValue' => array('id' => '280', 'tag' => 'MinSampleValue', 'categorie' => 'IFD0'),
142
		'MaxSampleValue' => array('id' => '281', 'tag' => 'MaxSampleValue', 'categorie' => 'IFD0'),
143
		'XResolution' => array('id' => '282', 'tag' => 'XResolution', 'categorie' => 'IFD0'),
144
		'YResolution' => array('id' => '283', 'tag' => 'YResolution', 'categorie' => 'IFD0'),
145
		'PlanarConfiguration' => array('id' => '284', 'tag' => 'PlanarConfiguration', 'categorie' => 'IFD0'),
146
		'PageName' => array('id' => '285', 'tag' => 'PageName', 'categorie' => 'IFD0'),
147
		'XPosition' => array('id' => '286', 'tag' => 'XPosition', 'categorie' => 'IFD0'),
148
		'YPosition' => array('id' => '287', 'tag' => 'YPosition', 'categorie' => 'IFD0'),
149
		'FreeOffsets' => array('id' => '288', 'tag' => 'FreeOffsets', 'categorie' => 'Unknown'),
150
		'FreeByteCounts' => array('id' => '289', 'tag' => 'FreeByteCounts', 'categorie' => 'Unknown'),
151
		'GrayResponseUnit' => array('id' => '290', 'tag' => 'GrayResponseUnit', 'categorie' => 'IFD0'),
152
		'GrayResponseCurve' => array('id' => '291', 'tag' => 'GrayResponseCurve', 'categorie' => 'Unknown'),
153
		'T4Options' => array('id' => '292', 'tag' => 'T4Options', 'categorie' => 'Unknown'),
154
		'T6Options' => array('id' => '293', 'tag' => 'T6Options', 'categorie' => 'Unknown'),
155
		'ResolutionUnit' => array('id' => '296', 'tag' => 'ResolutionUnit', 'categorie' => 'IFD0'),
156
		'PageNumber' => array('id' => '297', 'tag' => 'PageNumber', 'categorie' => 'IFD0'),
157
		'ColorResponseUnit' => array('id' => '300', 'tag' => 'ColorResponseUnit', 'categorie' => 'Unknown'),
158
		'TransferFunction' => array('id' => '301', 'tag' => 'TransferFunction', 'categorie' => 'IFD0'),
159
		'Software' => array('id' => '305', 'tag' => 'Software', 'categorie' => 'IFD0'),
160
		'ModifyDate' => array('id' => '306', 'tag' => 'ModifyDate', 'categorie' => 'IFD0'),
161
		'DateTime' => array('id' => '306', 'tag' => 'ModifyDate', 'categorie' => 'IFD0'),
162
		'Artist' => array('id' => '315', 'tag' => 'Artist', 'categorie' => 'IFD0'),
163
		'HostComputer' => array('id' => '316', 'tag' => 'HostComputer', 'categorie' => 'IFD0'),
164
		'Predictor' => array('id' => '317', 'tag' => 'Predictor', 'categorie' => 'IFD0'),
165
		'WhitePoint' => array('id' => '318', 'tag' => 'WhitePoint', 'categorie' => 'IFD0'),
166
		'PrimaryChromaticities' => array('id' => '319', 'tag' => 'PrimaryChromaticities', 'categorie' => 'IFD0'),
167
		'ColorMap' => array('id' => '320', 'tag' => 'ColorMap', 'categorie' => 'Unknown'),
168
		'HalftoneHints' => array('id' => '321', 'tag' => 'HalftoneHints', 'categorie' => 'IFD0'),
169
		'TileWidth' => array('id' => '322', 'tag' => 'TileWidth', 'categorie' => 'IFD0'),
170
		'TileLength' => array('id' => '323', 'tag' => 'TileLength', 'categorie' => 'IFD0'),
171
		'TileOffsets' => array('id' => '324', 'tag' => 'TileOffsets', 'categorie' => 'Unknown'),
172
		'TileByteCounts' => array('id' => '325', 'tag' => 'TileByteCounts', 'categorie' => 'Unknown'),
173
		'BadFaxLines' => array('id' => '326', 'tag' => 'BadFaxLines', 'categorie' => 'Unknown'),
174
		'CleanFaxData' => array('id' => '327', 'tag' => 'CleanFaxData', 'categorie' => 'Unknown'),
175
		'ConsecutiveBadFaxLines' => array('id' => '328', 'tag' => 'ConsecutiveBadFaxLines', 'categorie' => 'Unknown'),
176
		'SubIFD' => array('id' => '330', 'tag' => 'SubIFD', 'categorie' => 'Unknown'),
177
		'InkSet' => array('id' => '332', 'tag' => 'InkSet', 'categorie' => 'IFD0'),
178
		'InkNames' => array('id' => '333', 'tag' => 'InkNames', 'categorie' => 'Unknown'),
179
		'NumberofInks' => array('id' => '334', 'tag' => 'NumberofInks', 'categorie' => 'Unknown'),
180
		'DotRange' => array('id' => '336', 'tag' => 'DotRange', 'categorie' => 'IFD0'),
181
		'TargetPrinter' => array('id' => '337', 'tag' => 'TargetPrinter', 'categorie' => 'Unknown'),
182
		'ExtraSamples' => array('id' => '338', 'tag' => 'ExtraSamples', 'categorie' => 'Unknown'),
183
		'SampleFormat' => array('id' => '339', 'tag' => 'SampleFormat', 'categorie' => 'Unknown'),
184
		'SMinSampleValue' => array('id' => '340', 'tag' => 'SMinSampleValue', 'categorie' => 'Unknown'),
185
		'SMaxSampleValue' => array('id' => '341', 'tag' => 'SMaxSampleValue', 'categorie' => 'Unknown'),
186
		'TransferRange' => array('id' => '342', 'tag' => 'TransferRange', 'categorie' => 'Unknown'),
187
		'ClipPath' => array('id' => '343', 'tag' => 'ClipPath', 'categorie' => 'Unknown'),
188
		'XClipPathUnits' => array('id' => '344', 'tag' => 'XClipPathUnits', 'categorie' => 'Unknown'),
189
		'YClipPathUnits' => array('id' => '345', 'tag' => 'YClipPathUnits', 'categorie' => 'Unknown'),
190
		'Indexed' => array('id' => '346', 'tag' => 'Indexed', 'categorie' => 'Unknown'),
191
		'JPEGTables' => array('id' => '347', 'tag' => 'JPEGTables', 'categorie' => 'Unknown'),
192
		'OPIProxy' => array('id' => '351', 'tag' => 'OPIProxy', 'categorie' => 'Unknown'),
193
		'GlobalParametersIFD' => array('id' => '400', 'tag' => 'GlobalParametersIFD', 'categorie' => 'Unknown'),
194
		'ProfileType' => array('id' => '401', 'tag' => 'ProfileType', 'categorie' => 'Unknown'),
195
		'FaxProfile' => array('id' => '402', 'tag' => 'FaxProfile', 'categorie' => 'Unknown'),
196
		'CodingMethods' => array('id' => '403', 'tag' => 'CodingMethods', 'categorie' => 'Unknown'),
197
		'VersionYear' => array('id' => '404', 'tag' => 'VersionYear', 'categorie' => 'Unknown'),
198
		'ModeNumber' => array('id' => '405', 'tag' => 'ModeNumber', 'categorie' => 'Unknown'),
199
		'Decode' => array('id' => '433', 'tag' => 'Decode', 'categorie' => 'Unknown'),
200
		'DefaultImageColor' => array('id' => '434', 'tag' => 'DefaultImageColor', 'categorie' => 'Unknown'),
201
		'T82Options' => array('id' => '435', 'tag' => 'T82Options', 'categorie' => 'Unknown'),
202
		'JPEGProc' => array('id' => '512', 'tag' => 'JPEGProc', 'categorie' => 'Unknown'),
203
		'ThumbnailOffset' => array('id' => '513', 'tag' => 'ThumbnailOffset', 'categorie' => 'IFD1'),
204
		'ThumbnailLength' => array('id' => '514', 'tag' => 'ThumbnailLength', 'categorie' => 'IFD1'),
205
		'JPEGRestartInterval' => array('id' => '515', 'tag' => 'JPEGRestartInterval', 'categorie' => 'Unknown'),
206
		'JPEGLosslessPredictors' => array('id' => '517', 'tag' => 'JPEGLosslessPredictors', 'categorie' => 'Unknown'),
207
		'JPEGPointTransforms' => array('id' => '518', 'tag' => 'JPEGPointTransforms', 'categorie' => 'Unknown'),
208
		'JPEGQTables' => array('id' => '519', 'tag' => 'JPEGQTables', 'categorie' => 'Unknown'),
209
		'JPEGDCTables' => array('id' => '520', 'tag' => 'JPEGDCTables', 'categorie' => 'Unknown'),
210
		'JPEGACTables' => array('id' => '521', 'tag' => 'JPEGACTables', 'categorie' => 'Unknown'),
211
		'YCbCrCoefficients' => array('id' => '529', 'tag' => 'YCbCrCoefficients', 'categorie' => 'IFD0'),
212
		'YCbCrSubSampling' => array('id' => '530', 'tag' => 'YCbCrSubSampling', 'categorie' => 'IFD0'),
213
		'YCbCrPositioning' => array('id' => '531', 'tag' => 'YCbCrPositioning', 'categorie' => 'IFD0'),
214
		'ReferenceBlackWhite' => array('id' => '532', 'tag' => 'ReferenceBlackWhite', 'categorie' => 'IFD0'),
215
		'StripRowCounts' => array('id' => '559', 'tag' => 'StripRowCounts', 'categorie' => 'Unknown'),
216
		'ApplicationNotes' => array('id' => '700', 'tag' => 'ApplicationNotes', 'categorie' => 'ExifIFD'),
217
		'USPTOMiscellaneous' => array('id' => '999', 'tag' => 'USPTOMiscellaneous', 'categorie' => 'Unknown'),
218
		'RelatedImageFileFormat' => array('id' => '4096', 'tag' => 'RelatedImageFileFormat', 'categorie' => 'InteropIFD'),
219
		'RelatedImageWidth' => array('id' => '4097', 'tag' => 'RelatedImageWidth', 'categorie' => 'InteropIFD'),
220
		'RelatedImageHeight' => array('id' => '4098', 'tag' => 'RelatedImageHeight', 'categorie' => 'InteropIFD'),
221
		'RelatedImageLength' => array('id' => '4098', 'tag' => 'RelatedImageHeight', 'categorie' => 'InteropIFD'),
222
		'Rating' => array('id' => '18246', 'tag' => 'Rating', 'categorie' => 'IFD0'),
223
		'XP_DIP_XML' => array('id' => '18247', 'tag' => 'XP_DIP_XML', 'categorie' => 'Unknown'),
224
		'StitchInfo' => array('id' => '18248', 'tag' => 'StitchInfo', 'categorie' => 'Unknown'),
225
		'RatingPercent' => array('id' => '18249', 'tag' => 'RatingPercent', 'categorie' => 'IFD0'),
226
		'ImageID' => array('id' => '32781', 'tag' => 'ImageID', 'categorie' => 'Unknown'),
227
		'WangTag1' => array('id' => '32931', 'tag' => 'WangTag1', 'categorie' => 'Unknown'),
228
		'WangAnnotation' => array('id' => '32932', 'tag' => 'WangAnnotation', 'categorie' => 'Unknown'),
229
		'WangTag3' => array('id' => '32933', 'tag' => 'WangTag3', 'categorie' => 'Unknown'),
230
		'WangTag4' => array('id' => '32934', 'tag' => 'WangTag4', 'categorie' => 'Unknown'),
231
		'Matteing' => array('id' => '32995', 'tag' => 'Matteing', 'categorie' => 'Unknown'),
232
		'DataType' => array('id' => '32996', 'tag' => 'DataType', 'categorie' => 'Unknown'),
233
		'ImageDepth' => array('id' => '32997', 'tag' => 'ImageDepth', 'categorie' => 'Unknown'),
234
		'TileDepth' => array('id' => '32998', 'tag' => 'TileDepth', 'categorie' => 'Unknown'),
235
		'Model2' => array('id' => '33405', 'tag' => 'Model2', 'categorie' => 'Unknown'),
236
		'CFARepeatPatternDim' => array('id' => '33421', 'tag' => 'CFARepeatPatternDim', 'categorie' => 'Unknown'),
237
		'CFAPattern2' => array('id' => '33422', 'tag' => 'CFAPattern2', 'categorie' => 'Unknown'),
238
		'BatteryLevel' => array('id' => '33423', 'tag' => 'BatteryLevel', 'categorie' => 'Unknown'),
239
		'KodakIFD' => array('id' => '33424', 'tag' => 'KodakIFD', 'categorie' => 'Unknown'),
240
		'Copyright' => array('id' => '33432', 'tag' => 'Copyright', 'categorie' => 'IFD0'),
241
		'ExposureTime' => array('id' => '33434', 'tag' => 'ExposureTime', 'categorie' => 'ExifIFD'),
242
		'FNumber' => array('id' => '33437', 'tag' => 'FNumber', 'categorie' => 'ExifIFD'),
243
		'MDFileTag' => array('id' => '33445', 'tag' => 'MDFileTag', 'categorie' => 'Unknown'),
244
		'MDScalePixel' => array('id' => '33446', 'tag' => 'MDScalePixel', 'categorie' => 'Unknown'),
245
		'MDColorTable' => array('id' => '33447', 'tag' => 'MDColorTable', 'categorie' => 'Unknown'),
246
		'MDLabName' => array('id' => '33448', 'tag' => 'MDLabName', 'categorie' => 'Unknown'),
247
		'MDSampleInfo' => array('id' => '33449', 'tag' => 'MDSampleInfo', 'categorie' => 'Unknown'),
248
		'MDPrepDate' => array('id' => '33450', 'tag' => 'MDPrepDate', 'categorie' => 'Unknown'),
249
		'MDPrepTime' => array('id' => '33451', 'tag' => 'MDPrepTime', 'categorie' => 'Unknown'),
250
		'MDFileUnits' => array('id' => '33452', 'tag' => 'MDFileUnits', 'categorie' => 'Unknown'),
251
		'PixelScale' => array('id' => '33550', 'tag' => 'PixelScale', 'categorie' => 'Unknown'),
252
		'AdventScale' => array('id' => '33589', 'tag' => 'AdventScale', 'categorie' => 'Unknown'),
253
		'AdventRevision' => array('id' => '33590', 'tag' => 'AdventRevision', 'categorie' => 'Unknown'),
254
		'UIC1Tag' => array('id' => '33628', 'tag' => 'UIC1Tag', 'categorie' => 'Unknown'),
255
		'UIC2Tag' => array('id' => '33629', 'tag' => 'UIC2Tag', 'categorie' => 'Unknown'),
256
		'UIC3Tag' => array('id' => '33630', 'tag' => 'UIC3Tag', 'categorie' => 'Unknown'),
257
		'UIC4Tag' => array('id' => '33631', 'tag' => 'UIC4Tag', 'categorie' => 'Unknown'),
258
		'IPTC-NAA' => array('id' => '33723', 'tag' => 'IPTC-NAA', 'categorie' => 'IFD0'),
259
		'IntergraphPacketData' => array('id' => '33918', 'tag' => 'IntergraphPacketData', 'categorie' => 'Unknown'),
260
		'IntergraphFlagRegisters' => array('id' => '33919', 'tag' => 'IntergraphFlagRegisters', 'categorie' => 'Unknown'),
261
		'IntergraphMatrix' => array('id' => '33920', 'tag' => 'IntergraphMatrix', 'categorie' => 'Unknown'),
262
		'INGRReserved' => array('id' => '33921', 'tag' => 'INGRReserved', 'categorie' => 'Unknown'),
263
		'ModelTiePoint' => array('id' => '33922', 'tag' => 'ModelTiePoint', 'categorie' => 'Unknown'),
264
		'Site' => array('id' => '34016', 'tag' => 'Site', 'categorie' => 'Unknown'),
265
		'ColorSequence' => array('id' => '34017', 'tag' => 'ColorSequence', 'categorie' => 'Unknown'),
266
		'IT8Header' => array('id' => '34018', 'tag' => 'IT8Header', 'categorie' => 'Unknown'),
267
		'RasterPadding' => array('id' => '34019', 'tag' => 'RasterPadding', 'categorie' => 'Unknown'),
268
		'BitsPerRunLength' => array('id' => '34020', 'tag' => 'BitsPerRunLength', 'categorie' => 'Unknown'),
269
		'BitsPerExtendedRunLength' => array('id' => '34021', 'tag' => 'BitsPerExtendedRunLength', 'categorie' => 'Unknown'),
270
		'ColorTable' => array('id' => '34022', 'tag' => 'ColorTable', 'categorie' => 'Unknown'),
271
		'ImageColorIndicator' => array('id' => '34023', 'tag' => 'ImageColorIndicator', 'categorie' => 'Unknown'),
272
		'BackgroundColorIndicator' => array('id' => '34024', 'tag' => 'BackgroundColorIndicator', 'categorie' => 'Unknown'),
273
		'ImageColorValue' => array('id' => '34025', 'tag' => 'ImageColorValue', 'categorie' => 'Unknown'),
274
		'BackgroundColorValue' => array('id' => '34026', 'tag' => 'BackgroundColorValue', 'categorie' => 'Unknown'),
275
		'PixelIntensityRange' => array('id' => '34027', 'tag' => 'PixelIntensityRange', 'categorie' => 'Unknown'),
276
		'TransparencyIndicator' => array('id' => '34028', 'tag' => 'TransparencyIndicator', 'categorie' => 'Unknown'),
277
		'ColorCharacterization' => array('id' => '34029', 'tag' => 'ColorCharacterization', 'categorie' => 'Unknown'),
278
		'HCUsage' => array('id' => '34030', 'tag' => 'HCUsage', 'categorie' => 'Unknown'),
279
		'TrapIndicator' => array('id' => '34031', 'tag' => 'TrapIndicator', 'categorie' => 'Unknown'),
280
		'CMYKEquivalent' => array('id' => '34032', 'tag' => 'CMYKEquivalent', 'categorie' => 'Unknown'),
281
		'SEMInfo' => array('id' => '34118', 'tag' => 'SEMInfo', 'categorie' => 'IFD0'),
282
		'AFCP_IPTC' => array('id' => '34152', 'tag' => 'AFCP_IPTC', 'categorie' => 'Unknown'),
283
		'PixelMagicJBIGOptions' => array('id' => '34232', 'tag' => 'PixelMagicJBIGOptions', 'categorie' => 'Unknown'),
284
		'ModelTransform' => array('id' => '34264', 'tag' => 'ModelTransform', 'categorie' => 'Unknown'),
285
		'WB_GRGBLevels' => array('id' => '34306', 'tag' => 'WB_GRGBLevels', 'categorie' => 'Unknown'),
286
		'LeafData' => array('id' => '34310', 'tag' => 'LeafData', 'categorie' => 'Unknown'),
287
		'PhotoshopSettings' => array('id' => '34377', 'tag' => 'PhotoshopSettings', 'categorie' => 'Unknown'),
288
		'ExifIFDPointer' => array('id' => '34665', 'tag' => 'ExifOffset', 'categorie' => 'Unknown'),
289
		'ICC_Profile' => array('id' => '34675', 'tag' => 'ICC_Profile', 'categorie' => 'Unknown'),
290
		'TIFF_FXExtensions' => array('id' => '34687', 'tag' => 'TIFF_FXExtensions', 'categorie' => 'Unknown'),
291
		'MultiProfiles' => array('id' => '34688', 'tag' => 'MultiProfiles', 'categorie' => 'Unknown'),
292
		'SharedData' => array('id' => '34689', 'tag' => 'SharedData', 'categorie' => 'Unknown'),
293
		'T88Options' => array('id' => '34690', 'tag' => 'T88Options', 'categorie' => 'Unknown'),
294
		'ImageLayer' => array('id' => '34732', 'tag' => 'ImageLayer', 'categorie' => 'Unknown'),
295
		'GeoTiffDirectory' => array('id' => '34735', 'tag' => 'GeoTiffDirectory', 'categorie' => 'Unknown'),
296
		'GeoTiffDoubleParams' => array('id' => '34736', 'tag' => 'GeoTiffDoubleParams', 'categorie' => 'Unknown'),
297
		'GeoTiffAsciiParams' => array('id' => '34737', 'tag' => 'GeoTiffAsciiParams', 'categorie' => 'Unknown'),
298
		'ExposureProgram' => array('id' => '34850', 'tag' => 'ExposureProgram', 'categorie' => 'ExifIFD'),
299
		'SpectralSensitivity' => array('id' => '34852', 'tag' => 'SpectralSensitivity', 'categorie' => 'ExifIFD'),
300
		'GPSIFDPointer' => array('id' => '34853', 'tag' => 'GPSInfo', 'categorie' => 'Unknown'),
301
		'ISO' => array('id' => '34855', 'tag' => 'ISO', 'categorie' => 'ExifIFD'),
302
		'ISOSpeedRatings' => array('id' => '34855', 'tag' => 'ISO', 'categorie' => 'ExifIFD'),
303
		'PhotographicSensitivity' => array('id' => '34855', 'tag' => 'ISO', 'categorie' => 'ExifIFD'),
304
		'Opto-ElectricConvFactor' => array('id' => '34856', 'tag' => 'Opto-ElectricConvFactor', 'categorie' => 'Unknown'),
305
		'OECF' => array('id' => '34856', 'tag' => 'Opto-ElectricConvFactor', 'categorie' => 'Unknown'),
306
		'Interlace' => array('id' => '34857', 'tag' => 'Interlace', 'categorie' => 'Unknown'),
307
		'TimeZoneOffset' => array('id' => '34858', 'tag' => 'TimeZoneOffset', 'categorie' => 'ExifIFD'),
308
		'SelfTimerMode' => array('id' => '34859', 'tag' => 'SelfTimerMode', 'categorie' => 'ExifIFD'),
309
		'SensitivityType' => array('id' => '34864', 'tag' => 'SensitivityType', 'categorie' => 'ExifIFD'),
310
		'StandardOutputSensitivity' => array('id' => '34865', 'tag' => 'StandardOutputSensitivity', 'categorie' => 'ExifIFD'),
311
		'RecommendedExposureIndex' => array('id' => '34866', 'tag' => 'RecommendedExposureIndex', 'categorie' => 'ExifIFD'),
312
		'ISOSpeed' => array('id' => '34867', 'tag' => 'ISOSpeed', 'categorie' => 'ExifIFD'),
313
		'ISOSpeedLatitudeyyy' => array('id' => '34868', 'tag' => 'ISOSpeedLatitudeyyy', 'categorie' => 'ExifIFD'),
314
		'ISOSpeedLatitudezzz' => array('id' => '34869', 'tag' => 'ISOSpeedLatitudezzz', 'categorie' => 'ExifIFD'),
315
		'FaxRecvParams' => array('id' => '34908', 'tag' => 'FaxRecvParams', 'categorie' => 'Unknown'),
316
		'FaxSubAddress' => array('id' => '34909', 'tag' => 'FaxSubAddress', 'categorie' => 'Unknown'),
317
		'FaxRecvTime' => array('id' => '34910', 'tag' => 'FaxRecvTime', 'categorie' => 'Unknown'),
318
		'LeafSubIFD' => array('id' => '34954', 'tag' => 'LeafSubIFD', 'categorie' => 'Unknown'),
319
		'ExifVersion' => array('id' => '36864', 'tag' => 'ExifVersion', 'categorie' => 'ExifIFD'),
320
		'DateTimeOriginal' => array('id' => '36867', 'tag' => 'DateTimeOriginal', 'categorie' => 'ExifIFD'),
321
		'CreateDate' => array('id' => '36868', 'tag' => 'CreateDate', 'categorie' => 'ExifIFD'),
322
		'DateTimeDigitized' => array('id' => '36868', 'tag' => 'CreateDate', 'categorie' => 'ExifIFD'),
323
		'ComponentsConfiguration' => array('id' => '37121', 'tag' => 'ComponentsConfiguration', 'categorie' => 'ExifIFD'),
324
		'CompressedBitsPerPixel' => array('id' => '37122', 'tag' => 'CompressedBitsPerPixel', 'categorie' => 'ExifIFD'),
325
		'ShutterSpeedValue' => array('id' => '37377', 'tag' => 'ShutterSpeedValue', 'categorie' => 'ExifIFD'),
326
		'ApertureValue' => array('id' => '37378', 'tag' => 'ApertureValue', 'categorie' => 'ExifIFD'),
327
		'BrightnessValue' => array('id' => '37379', 'tag' => 'BrightnessValue', 'categorie' => 'ExifIFD'),
328
		'ExposureBiasValue' => array('id' => '37380', 'tag' => 'ExposureCompensation', 'categorie' => 'ExifIFD'),
329
		'MaxApertureValue' => array('id' => '37381', 'tag' => 'MaxApertureValue', 'categorie' => 'ExifIFD'),
330
		'SubjectDistance' => array('id' => '37382', 'tag' => 'SubjectDistance', 'categorie' => 'ExifIFD'),
331
		'MeteringMode' => array('id' => '37383', 'tag' => 'MeteringMode', 'categorie' => 'ExifIFD'),
332
		'LightSource' => array('id' => '37384', 'tag' => 'LightSource', 'categorie' => 'ExifIFD'),
333
		'Flash' => array('id' => '37385', 'tag' => 'Flash', 'categorie' => 'ExifIFD'),
334
		'FocalLength' => array('id' => '37386', 'tag' => 'FocalLength', 'categorie' => 'ExifIFD'),
335
		'FlashEnergy' => array('id' => '37387', 'tag' => 'FlashEnergy', 'categorie' => 'Unknown'),
336
		'SpatialFrequencyResponse' => array('id' => '37388', 'tag' => 'SpatialFrequencyResponse', 'categorie' => 'Unknown'),
337
		'Noise' => array('id' => '37389', 'tag' => 'Noise', 'categorie' => 'Unknown'),
338
		'FocalPlaneXResolution' => array('id' => '37390', 'tag' => 'FocalPlaneXResolution', 'categorie' => 'Unknown'),
339
		'FocalPlaneYResolution' => array('id' => '37391', 'tag' => 'FocalPlaneYResolution', 'categorie' => 'Unknown'),
340
		'FocalPlaneResolutionUnit' => array('id' => '37392', 'tag' => 'FocalPlaneResolutionUnit', 'categorie' => 'Unknown'),
341
		'ImageNumber' => array('id' => '37393', 'tag' => 'ImageNumber', 'categorie' => 'ExifIFD'),
342
		'SecurityClassification' => array('id' => '37394', 'tag' => 'SecurityClassification', 'categorie' => 'ExifIFD'),
343
		'ImageHistory' => array('id' => '37395', 'tag' => 'ImageHistory', 'categorie' => 'ExifIFD'),
344
		'SubjectArea' => array('id' => '37396', 'tag' => 'SubjectArea', 'categorie' => 'ExifIFD'),
345
		'ExposureIndex' => array('id' => '37397', 'tag' => 'ExposureIndex', 'categorie' => 'Unknown'),
346
		'TIFF-EPStandardID' => array('id' => '37398', 'tag' => 'TIFF-EPStandardID', 'categorie' => 'Unknown'),
347
		'SensingMethod' => array('id' => '37399', 'tag' => 'SensingMethod', 'categorie' => 'Unknown'),
348
		'CIP3DataFile' => array('id' => '37434', 'tag' => 'CIP3DataFile', 'categorie' => 'Unknown'),
349
		'CIP3Sheet' => array('id' => '37435', 'tag' => 'CIP3Sheet', 'categorie' => 'Unknown'),
350
		'CIP3Side' => array('id' => '37436', 'tag' => 'CIP3Side', 'categorie' => 'Unknown'),
351
		'StoNits' => array('id' => '37439', 'tag' => 'StoNits', 'categorie' => 'Unknown'),
352
		'MakerNote' => array('id' => '37500', 'tag' => 'MakerNote', 'categorie' => 'ExifIFD'),
353
		'UserComment' => array('id' => '37510', 'tag' => 'UserComment', 'categorie' => 'ExifIFD'),
354
		'SubSecTime' => array('id' => '37520', 'tag' => 'SubSecTime', 'categorie' => 'ExifIFD'),
355
		'SubSecTimeOriginal' => array('id' => '37521', 'tag' => 'SubSecTimeOriginal', 'categorie' => 'ExifIFD'),
356
		'SubSecTimeDigitized' => array('id' => '37522', 'tag' => 'SubSecTimeDigitized', 'categorie' => 'ExifIFD'),
357
		'MSDocumentText' => array('id' => '37679', 'tag' => 'MSDocumentText', 'categorie' => 'Unknown'),
358
		'MSPropertySetStorage' => array('id' => '37680', 'tag' => 'MSPropertySetStorage', 'categorie' => 'Unknown'),
359
		'MSDocumentTextPosition' => array('id' => '37681', 'tag' => 'MSDocumentTextPosition', 'categorie' => 'Unknown'),
360
		'ImageSourceData' => array('id' => '37724', 'tag' => 'ImageSourceData', 'categorie' => 'IFD0'),
361
		'XPTitle' => array('id' => '40091', 'tag' => 'XPTitle', 'categorie' => 'IFD0'),
362
		'XPComment' => array('id' => '40092', 'tag' => 'XPComment', 'categorie' => 'IFD0'),
363
		'XPAuthor' => array('id' => '40093', 'tag' => 'XPAuthor', 'categorie' => 'IFD0'),
364
		'XPKeywords' => array('id' => '40094', 'tag' => 'XPKeywords', 'categorie' => 'IFD0'),
365
		'XPSubject' => array('id' => '40095', 'tag' => 'XPSubject', 'categorie' => 'IFD0'),
366
		'FlashPixVersion' => array('id' => '40960', 'tag' => 'FlashpixVersion', 'categorie' => 'ExifIFD'),
367
		'ColorSpace' => array('id' => '40961', 'tag' => 'ColorSpace', 'categorie' => 'ExifIFD'),
368
		'ExifImageWidth' => array('id' => '40962', 'tag' => 'ExifImageWidth', 'categorie' => 'ExifIFD'),
369
		'PixelXDimension' => array('id' => '40962', 'tag' => 'ExifImageWidth', 'categorie' => 'ExifIFD'),
370
		'ExifImageHeight' => array('id' => '40963', 'tag' => 'ExifImageHeight', 'categorie' => 'ExifIFD'),
371
		'PixelYDimension' => array('id' => '40963', 'tag' => 'ExifImageHeight', 'categorie' => 'ExifIFD'),
372
		'RelatedSoundFile' => array('id' => '40964', 'tag' => 'RelatedSoundFile', 'categorie' => 'ExifIFD'),
373
		'InteroperabilityOffset' => array('id' => '40965', 'tag' => 'InteropOffset', 'categorie' => 'Unknown'),
374
		'SubjectLocation' => array('id' => '41492', 'tag' => 'SubjectLocation', 'categorie' => 'ExifIFD'),
375
		'FileSource' => array('id' => '41728', 'tag' => 'FileSource', 'categorie' => 'ExifIFD'),
376
		'SceneType' => array('id' => '41729', 'tag' => 'SceneType', 'categorie' => 'ExifIFD'),
377
		'CFAPattern' => array('id' => '41730', 'tag' => 'CFAPattern', 'categorie' => 'ExifIFD'),
378
		'CustomRendered' => array('id' => '41985', 'tag' => 'CustomRendered', 'categorie' => 'ExifIFD'),
379
		'ExposureMode' => array('id' => '41986', 'tag' => 'ExposureMode', 'categorie' => 'ExifIFD'),
380
		'WhiteBalance' => array('id' => '41987', 'tag' => 'WhiteBalance', 'categorie' => 'ExifIFD'),
381
		'DigitalZoomRatio' => array('id' => '41988', 'tag' => 'DigitalZoomRatio', 'categorie' => 'ExifIFD'),
382
		'FocalLengthIn35mmFormat' => array('id' => '41989', 'tag' => 'FocalLengthIn35mmFormat', 'categorie' => 'ExifIFD'),
383
		'FocalLengthIn35mmFilm' => array('id' => '41989', 'tag' => 'FocalLengthIn35mmFormat', 'categorie' => 'ExifIFD'),
384
		'SceneCaptureType' => array('id' => '41990', 'tag' => 'SceneCaptureType', 'categorie' => 'ExifIFD'),
385
		'GainControl' => array('id' => '41991', 'tag' => 'GainControl', 'categorie' => 'ExifIFD'),
386
		'Contrast' => array('id' => '41992', 'tag' => 'Contrast', 'categorie' => 'ExifIFD'),
387
		'Saturation' => array('id' => '41993', 'tag' => 'Saturation', 'categorie' => 'ExifIFD'),
388
		'Sharpness' => array('id' => '41994', 'tag' => 'Sharpness', 'categorie' => 'ExifIFD'),
389
		'DeviceSettingDescription' => array('id' => '41995', 'tag' => 'DeviceSettingDescription', 'categorie' => 'Unknown'),
390
		'SubjectDistanceRange' => array('id' => '41996', 'tag' => 'SubjectDistanceRange', 'categorie' => 'ExifIFD'),
391
		'ImageUniqueID' => array('id' => '42016', 'tag' => 'ImageUniqueID', 'categorie' => 'ExifIFD'),
392
		'OwnerName' => array('id' => '42032', 'tag' => 'OwnerName', 'categorie' => 'ExifIFD'),
393
		'CameraOwnerName' => array('id' => '42032', 'tag' => 'OwnerName', 'categorie' => 'ExifIFD'),
394
		'SerialNumber' => array('id' => '42033', 'tag' => 'SerialNumber', 'categorie' => 'ExifIFD'),
395
		'BodySerialNumber' => array('id' => '42033', 'tag' => 'SerialNumber', 'categorie' => 'ExifIFD'),
396
		'LensInfo' => array('id' => '42034', 'tag' => 'LensInfo', 'categorie' => 'ExifIFD'),
397
		'LensSpecification' => array('id' => '42034', 'tag' => 'LensInfo', 'categorie' => 'ExifIFD'),
398
		'LensMake' => array('id' => '42035', 'tag' => 'LensMake', 'categorie' => 'ExifIFD'),
399
		'LensModel' => array('id' => '42036', 'tag' => 'LensModel', 'categorie' => 'ExifIFD'),
400
		'LensSerialNumber' => array('id' => '42037', 'tag' => 'LensSerialNumber', 'categorie' => 'ExifIFD'),
401
		'GDALMetadata' => array('id' => '42112', 'tag' => 'GDALMetadata', 'categorie' => 'Unknown'),
402
		'GDALNoData' => array('id' => '42113', 'tag' => 'GDALNoData', 'categorie' => 'Unknown'),
403
		'Gamma' => array('id' => '42240', 'tag' => 'Gamma', 'categorie' => 'ExifIFD'),
404
		'ExpandSoftware' => array('id' => '44992', 'tag' => 'ExpandSoftware', 'categorie' => 'Unknown'),
405
		'ExpandLens' => array('id' => '44993', 'tag' => 'ExpandLens', 'categorie' => 'Unknown'),
406
		'ExpandFilm' => array('id' => '44994', 'tag' => 'ExpandFilm', 'categorie' => 'Unknown'),
407
		'ExpandFilterLens' => array('id' => '44995', 'tag' => 'ExpandFilterLens', 'categorie' => 'Unknown'),
408
		'ExpandScanner' => array('id' => '44996', 'tag' => 'ExpandScanner', 'categorie' => 'Unknown'),
409
		'ExpandFlashLamp' => array('id' => '44997', 'tag' => 'ExpandFlashLamp', 'categorie' => 'Unknown'),
410
		'PixelFormat' => array('id' => '48129', 'tag' => 'PixelFormat', 'categorie' => 'Unknown'),
411
		'Transformation' => array('id' => '48130', 'tag' => 'Transformation', 'categorie' => 'Unknown'),
412
		'Uncompressed' => array('id' => '48131', 'tag' => 'Uncompressed', 'categorie' => 'Unknown'),
413
		'ImageType' => array('id' => '48132', 'tag' => 'ImageType', 'categorie' => 'Unknown'),
414
		'ImageHeight' => array('id' => '48257', 'tag' => 'ImageHeight', 'categorie' => 'Unknown'),
415
		'WidthResolution' => array('id' => '48258', 'tag' => 'WidthResolution', 'categorie' => 'Unknown'),
416
		'HeightResolution' => array('id' => '48259', 'tag' => 'HeightResolution', 'categorie' => 'Unknown'),
417
		'ImageOffset' => array('id' => '48320', 'tag' => 'ImageOffset', 'categorie' => 'Unknown'),
418
		'ImageByteCount' => array('id' => '48321', 'tag' => 'ImageByteCount', 'categorie' => 'Unknown'),
419
		'AlphaOffset' => array('id' => '48322', 'tag' => 'AlphaOffset', 'categorie' => 'Unknown'),
420
		'AlphaByteCount' => array('id' => '48323', 'tag' => 'AlphaByteCount', 'categorie' => 'Unknown'),
421
		'ImageDataDiscard' => array('id' => '48324', 'tag' => 'ImageDataDiscard', 'categorie' => 'Unknown'),
422
		'AlphaDataDiscard' => array('id' => '48325', 'tag' => 'AlphaDataDiscard', 'categorie' => 'Unknown'),
423
		'OceScanjobDesc' => array('id' => '50215', 'tag' => 'OceScanjobDesc', 'categorie' => 'Unknown'),
424
		'OceApplicationSelector' => array('id' => '50216', 'tag' => 'OceApplicationSelector', 'categorie' => 'Unknown'),
425
		'OceIDNumber' => array('id' => '50217', 'tag' => 'OceIDNumber', 'categorie' => 'Unknown'),
426
		'OceImageLogic' => array('id' => '50218', 'tag' => 'OceImageLogic', 'categorie' => 'Unknown'),
427
		'Annotations' => array('id' => '50255', 'tag' => 'Annotations', 'categorie' => 'Unknown'),
428
		'PrintIM' => array('id' => '50341', 'tag' => 'PrintIM', 'categorie' => 'IFD0'),
429
		'USPTOOriginalContentType' => array('id' => '50560', 'tag' => 'USPTOOriginalContentType', 'categorie' => 'Unknown'),
430
		'DNGVersion' => array('id' => '50706', 'tag' => 'DNGVersion', 'categorie' => 'IFD0'),
431
		'DNGBackwardVersion' => array('id' => '50707', 'tag' => 'DNGBackwardVersion', 'categorie' => 'IFD0'),
432
		'UniqueCameraModel' => array('id' => '50708', 'tag' => 'UniqueCameraModel', 'categorie' => 'IFD0'),
433
		'LocalizedCameraModel' => array('id' => '50709', 'tag' => 'LocalizedCameraModel', 'categorie' => 'IFD0'),
434
		'CFAPlaneColor' => array('id' => '50710', 'tag' => 'CFAPlaneColor', 'categorie' => 'Unknown'),
435
		'CFALayout' => array('id' => '50711', 'tag' => 'CFALayout', 'categorie' => 'Unknown'),
436
		'LinearizationTable' => array('id' => '50712', 'tag' => 'LinearizationTable', 'categorie' => 'SubIFD'),
437
		'BlackLevelRepeatDim' => array('id' => '50713', 'tag' => 'BlackLevelRepeatDim', 'categorie' => 'SubIFD'),
438
		'BlackLevel' => array('id' => '50714', 'tag' => 'BlackLevel', 'categorie' => 'SubIFD'),
439
		'BlackLevelDeltaH' => array('id' => '50715', 'tag' => 'BlackLevelDeltaH', 'categorie' => 'Unknown'),
440
		'BlackLevelDeltaV' => array('id' => '50716', 'tag' => 'BlackLevelDeltaV', 'categorie' => 'Unknown'),
441
		'WhiteLevel' => array('id' => '50717', 'tag' => 'WhiteLevel', 'categorie' => 'SubIFD'),
442
		'DefaultScale' => array('id' => '50718', 'tag' => 'DefaultScale', 'categorie' => 'SubIFD'),
443
		'DefaultCropOrigin' => array('id' => '50719', 'tag' => 'DefaultCropOrigin', 'categorie' => 'SubIFD'),
444
		'DefaultCropSize' => array('id' => '50720', 'tag' => 'DefaultCropSize', 'categorie' => 'SubIFD'),
445
		'ColorMatrix1' => array('id' => '50721', 'tag' => 'ColorMatrix1', 'categorie' => 'IFD0'),
446
		'ColorMatrix2' => array('id' => '50722', 'tag' => 'ColorMatrix2', 'categorie' => 'IFD0'),
447
		'CameraCalibration1' => array('id' => '50723', 'tag' => 'CameraCalibration1', 'categorie' => 'IFD0'),
448
		'CameraCalibration2' => array('id' => '50724', 'tag' => 'CameraCalibration2', 'categorie' => 'IFD0'),
449
		'ReductionMatrix1' => array('id' => '50725', 'tag' => 'ReductionMatrix1', 'categorie' => 'IFD0'),
450
		'ReductionMatrix2' => array('id' => '50726', 'tag' => 'ReductionMatrix2', 'categorie' => 'IFD0'),
451
		'AnalogBalance' => array('id' => '50727', 'tag' => 'AnalogBalance', 'categorie' => 'IFD0'),
452
		'AsShotNeutral' => array('id' => '50728', 'tag' => 'AsShotNeutral', 'categorie' => 'IFD0'),
453
		'AsShotWhiteXY' => array('id' => '50729', 'tag' => 'AsShotWhiteXY', 'categorie' => 'IFD0'),
454
		'BaselineExposure' => array('id' => '50730', 'tag' => 'BaselineExposure', 'categorie' => 'IFD0'),
455
		'BaselineNoise' => array('id' => '50731', 'tag' => 'BaselineNoise', 'categorie' => 'IFD0'),
456
		'BaselineSharpness' => array('id' => '50732', 'tag' => 'BaselineSharpness', 'categorie' => 'IFD0'),
457
		'BayerGreenSplit' => array('id' => '50733', 'tag' => 'BayerGreenSplit', 'categorie' => 'SubIFD'),
458
		'LinearResponseLimit' => array('id' => '50734', 'tag' => 'LinearResponseLimit', 'categorie' => 'IFD0'),
459
		'CameraSerialNumber' => array('id' => '50735', 'tag' => 'CameraSerialNumber', 'categorie' => 'IFD0'),
460
		'DNGLensInfo' => array('id' => '50736', 'tag' => 'DNGLensInfo', 'categorie' => 'IFD0'),
461
		'ChromaBlurRadius' => array('id' => '50737', 'tag' => 'ChromaBlurRadius', 'categorie' => 'SubIFD'),
462
		'AntiAliasStrength' => array('id' => '50738', 'tag' => 'AntiAliasStrength', 'categorie' => 'SubIFD'),
463
		'ShadowScale' => array('id' => '50739', 'tag' => 'ShadowScale', 'categorie' => 'IFD0'),
464
		'SR2Private' => array('id' => '50740', 'tag' => 'SR2Private', 'categorie' => 'Unknown'),
465
		'MakerNoteSafety' => array('id' => '50741', 'tag' => 'MakerNoteSafety', 'categorie' => 'IFD0'),
466
		'RawImageSegmentation' => array('id' => '50752', 'tag' => 'RawImageSegmentation', 'categorie' => 'Unknown'),
467
		'CalibrationIlluminant1' => array('id' => '50778', 'tag' => 'CalibrationIlluminant1', 'categorie' => 'IFD0'),
468
		'CalibrationIlluminant2' => array('id' => '50779', 'tag' => 'CalibrationIlluminant2', 'categorie' => 'IFD0'),
469
		'BestQualityScale' => array('id' => '50780', 'tag' => 'BestQualityScale', 'categorie' => 'SubIFD'),
470
		'RawDataUniqueID' => array('id' => '50781', 'tag' => 'RawDataUniqueID', 'categorie' => 'IFD0'),
471
		'AliasLayerMetadata' => array('id' => '50784', 'tag' => 'AliasLayerMetadata', 'categorie' => 'Unknown'),
472
		'OriginalRawFileName' => array('id' => '50827', 'tag' => 'OriginalRawFileName', 'categorie' => 'IFD0'),
473
		'OriginalRawFileData' => array('id' => '50828', 'tag' => 'OriginalRawFileData', 'categorie' => 'IFD0'),
474
		'ActiveArea' => array('id' => '50829', 'tag' => 'ActiveArea', 'categorie' => 'SubIFD'),
475
		'MaskedAreas' => array('id' => '50830', 'tag' => 'MaskedAreas', 'categorie' => 'SubIFD'),
476
		'AsShotICCProfile' => array('id' => '50831', 'tag' => 'AsShotICCProfile', 'categorie' => 'IFD0'),
477
		'AsShotPreProfileMatrix' => array('id' => '50832', 'tag' => 'AsShotPreProfileMatrix', 'categorie' => 'IFD0'),
478
		'CurrentICCProfile' => array('id' => '50833', 'tag' => 'CurrentICCProfile', 'categorie' => 'IFD0'),
479
		'CurrentPreProfileMatrix' => array('id' => '50834', 'tag' => 'CurrentPreProfileMatrix', 'categorie' => 'IFD0'),
480
		'ColorimetricReference' => array('id' => '50879', 'tag' => 'ColorimetricReference', 'categorie' => 'IFD0'),
481
		'PanasonicTitle' => array('id' => '50898', 'tag' => 'PanasonicTitle', 'categorie' => 'IFD0'),
482
		'PanasonicTitle2' => array('id' => '50899', 'tag' => 'PanasonicTitle2', 'categorie' => 'IFD0'),
483
		'CameraCalibrationSig' => array('id' => '50931', 'tag' => 'CameraCalibrationSig', 'categorie' => 'IFD0'),
484
		'ProfileCalibrationSig' => array('id' => '50932', 'tag' => 'ProfileCalibrationSig', 'categorie' => 'IFD0'),
485
		'ProfileIFD' => array('id' => '50933', 'tag' => 'ProfileIFD', 'categorie' => 'Unknown'),
486
		'AsShotProfileName' => array('id' => '50934', 'tag' => 'AsShotProfileName', 'categorie' => 'IFD0'),
487
		'NoiseReductionApplied' => array('id' => '50935', 'tag' => 'NoiseReductionApplied', 'categorie' => 'SubIFD'),
488
		'ProfileName' => array('id' => '50936', 'tag' => 'ProfileName', 'categorie' => 'IFD0'),
489
		'ProfileHueSatMapDims' => array('id' => '50937', 'tag' => 'ProfileHueSatMapDims', 'categorie' => 'IFD0'),
490
		'ProfileHueSatMapData1' => array('id' => '50938', 'tag' => 'ProfileHueSatMapData1', 'categorie' => 'IFD0'),
491
		'ProfileHueSatMapData2' => array('id' => '50939', 'tag' => 'ProfileHueSatMapData2', 'categorie' => 'IFD0'),
492
		'ProfileToneCurve' => array('id' => '50940', 'tag' => 'ProfileToneCurve', 'categorie' => 'IFD0'),
493
		'ProfileEmbedPolicy' => array('id' => '50941', 'tag' => 'ProfileEmbedPolicy', 'categorie' => 'IFD0'),
494
		'ProfileCopyright' => array('id' => '50942', 'tag' => 'ProfileCopyright', 'categorie' => 'IFD0'),
495
		'ForwardMatrix1' => array('id' => '50964', 'tag' => 'ForwardMatrix1', 'categorie' => 'IFD0'),
496
		'ForwardMatrix2' => array('id' => '50965', 'tag' => 'ForwardMatrix2', 'categorie' => 'IFD0'),
497
		'PreviewApplicationName' => array('id' => '50966', 'tag' => 'PreviewApplicationName', 'categorie' => 'IFD0'),
498
		'PreviewApplicationVersion' => array('id' => '50967', 'tag' => 'PreviewApplicationVersion', 'categorie' => 'IFD0'),
499
		'PreviewSettingsName' => array('id' => '50968', 'tag' => 'PreviewSettingsName', 'categorie' => 'IFD0'),
500
		'PreviewSettingsDigest' => array('id' => '50969', 'tag' => 'PreviewSettingsDigest', 'categorie' => 'IFD0'),
501
		'PreviewColorSpace' => array('id' => '50970', 'tag' => 'PreviewColorSpace', 'categorie' => 'IFD0'),
502
		'PreviewDateTime' => array('id' => '50971', 'tag' => 'PreviewDateTime', 'categorie' => 'IFD0'),
503
		'RawImageDigest' => array('id' => '50972', 'tag' => 'RawImageDigest', 'categorie' => 'IFD0'),
504
		'OriginalRawFileDigest' => array('id' => '50973', 'tag' => 'OriginalRawFileDigest', 'categorie' => 'IFD0'),
505
		'SubTileBlockSize' => array('id' => '50974', 'tag' => 'SubTileBlockSize', 'categorie' => 'Unknown'),
506
		'RowInterleaveFactor' => array('id' => '50975', 'tag' => 'RowInterleaveFactor', 'categorie' => 'Unknown'),
507
		'ProfileLookTableDims' => array('id' => '50981', 'tag' => 'ProfileLookTableDims', 'categorie' => 'IFD0'),
508
		'ProfileLookTableData' => array('id' => '50982', 'tag' => 'ProfileLookTableData', 'categorie' => 'IFD0'),
509
		'OpcodeList1' => array('id' => '51008', 'tag' => 'OpcodeList1', 'categorie' => 'Unknown'),
510
		'OpcodeList2' => array('id' => '51009', 'tag' => 'OpcodeList2', 'categorie' => 'Unknown'),
511
		'OpcodeList3' => array('id' => '51022', 'tag' => 'OpcodeList3', 'categorie' => 'Unknown'),
512
		'NoiseProfile' => array('id' => '51041', 'tag' => 'NoiseProfile', 'categorie' => 'Unknown'),
513
		'Padding' => array('id' => '59932', 'tag' => 'Padding', 'categorie' => 'ExifIFD'),
514
		'OffsetSchema' => array('id' => '59933', 'tag' => 'OffsetSchema', 'categorie' => 'ExifIFD'),
515
		'Lens' => array('id' => '65002', 'tag' => 'Lens', 'categorie' => 'ExifIFD'),
516
		'KDC_IFD' => array('id' => '65024', 'tag' => 'KDC_IFD', 'categorie' => 'Unknown'),
517
		'RawFile' => array('id' => '65100', 'tag' => 'RawFile', 'categorie' => 'ExifIFD'),
518
		'Converter' => array('id' => '65101', 'tag' => 'Converter', 'categorie' => 'ExifIFD'),
519
		'Exposure' => array('id' => '65105', 'tag' => 'Exposure', 'categorie' => 'ExifIFD'),
520
		'Shadows' => array('id' => '65106', 'tag' => 'Shadows', 'categorie' => 'ExifIFD'),
521
		'Brightness' => array('id' => '65107', 'tag' => 'Brightness', 'categorie' => 'ExifIFD'),
522
		'Sharpness:65110' => array('id' => '65110', 'tag' => 'Sharpness', 'categorie' => 'ExifIFD'),
523
		'Smoothness' => array('id' => '65111', 'tag' => 'Smoothness', 'categorie' => 'ExifIFD'),
524
		'MoireFilter' => array('id' => '65112', 'tag' => 'MoireFilter', 'categorie' => 'ExifIFD'),
525
		'FileName' => array('id' => 'php:1', 'tag' => 'FileName', 'categorie' => 'PhpFile'),
526
		'FileDateTime' => array('id' => 'php:2', 'tag' => 'FileDateTime', 'categorie' => 'PhpFile'),
527
		'FileSize' => array('id' => 'php:3', 'tag' => 'FileSize', 'categorie' => 'PhpFile'),
528
		'FileType' => array('id' => 'php:4', 'tag' => 'FileType', 'categorie' => 'PhpFile'),
529
		'MimeType' => array('id' => 'php:5', 'tag' => 'MimeType', 'categorie' => 'PhpFile'),
530
		'SectionsFound' => array('id' => 'php:6', 'tag' => 'SectionsFound', 'categorie' => 'PhpFile'),
531
		'JPEGInterchangeFormat' => array('id' => 'php:7', 'tag' => 'JPEGInterchangeFormat', 'categorie' => 'PhpThumbail'),
532
		'JPEGInterchangeFormatLength' => array('id' => 'php:8', 'tag' => 'JPEGInterchangeFormatLength', 'categorie' => 'PhpThumbail'),
533
		'Thumbnail.FileType' => array('id' => 'php:9', 'tag' => 'ThumbnailFileType', 'categorie' => 'PhpThumbail'),
534
		'Thumbnail.MimeType' => array('id' => 'php:10', 'tag' => 'ThumbnailMimeType', 'categorie' => 'PhpThumbail'),
535
		'Html' => array('id' => 'php:11', 'tag' => 'Html', 'categorie' => 'PhpComputed'),
536
		'IsColor' => array('id' => 'php:12', 'tag' => 'IsColor', 'categorie' => 'PhpComputed'),
537
		'ByteOrderMotorola' => array('id' => 'php:13', 'tag' => 'ByteOrderMotorola', 'categorie' => 'PhpComputed'),
538
		'ApertureFNumber' => array('id' => 'php:14', 'tag' => 'ApertureFNumber', 'categorie' => 'PhpComputed'),
539
		'UserCommentEncoding' => array('id' => 'php:15', 'tag' => 'UserCommentEncoding', 'categorie' => 'PhpComputed'),
540
		'ExifImageLength' => array('id' => 'php:16', 'tag' => 'ExifImageLength', 'categorie' => 'PhpComputed'),
541
		'InterOperabilityIndex' => array('id' => 'php:17', 'tag' => 'InterOperabilityIndex', 'categorie' => 'PhpComputed'),
542
		'InterOperabilityVersion' => array('id' => 'php:18', 'tag' => 'InterOperabilityVersion', 'categorie' => 'PhpComputed'),
543
		'SpecialMode' => array('id' => 'php:19', 'tag' => 'SpecialMode', 'categorie' => 'PhpComputed'),
544
		'JPEGQuality' => array('id' => 'php:20', 'tag' => 'JPEGQuality', 'categorie' => 'PhpComputed'),
545
		'Macro' => array('id' => 'php:21', 'tag' => 'Macro ', 'categorie' => 'PhpComputed'),
546
		'DigitalZoom' => array('id' => 'php:22', 'tag' => 'DigitalZoom', 'categorie' => 'PhpComputed'),
547
		'SoftwareRelease' => array('id' => 'php:23', 'tag' => 'SoftwareRelease', 'categorie' => 'PhpComputed'),
548
		'PictureInfo' => array('id' => 'php:24', 'tag' => 'PictureInfo', 'categorie' => 'PhpComputed'),
549
		'CameraId' => array('id' => 'php:25', 'tag' => 'CameraId', 'categorie' => 'PhpComputed'),
550
		'Gps' => array('id' => 'php:26', 'tag' => 'Gps', 'categorie' => 'PhpComputed'),
551
		'ACDComment' => array('id' => 'php:27', 'tag' => 'ACDComment', 'categorie' => 'PhpComputed'),
552
		'NewSubFile' => array('id' => 'php:28', 'tag' => 'NewSubFile', 'categorie' => 'PhpComputed'),
553
		'Comments' => array('id' => 'php:29', 'tag' => 'Comments', 'categorie' => 'PhpComputed'),
554
		'TIFF/EPStandardID' => array('id' => 'php:30', 'tag' => 'TIFFEPStandardID', 'categorie' => 'PhpComputed'),
555
		'ModeArray' => array('id' => 'php:31', 'tag' => 'ModeArray', 'categorie' => 'PhpComputed'),
556
		'ImageInfo' => array('id' => 'php:32', 'tag' => 'ImageInfo', 'categorie' => 'PhpComputed'),
557
		'FirmwareVersion' => array('id' => 'php:33', 'tag' => 'FirmwareVersion', 'categorie' => 'PhpComputed'),
558
		'Camera' => array('id' => 'php:34', 'tag' => 'Camera', 'categorie' => 'PhpComputed'),
559
		'CustomFunctions' => array('id' => 'php:35', 'tag' => 'CustomFunctions', 'categorie' => 'PhpComputed'),
560
		'CCDWidth' => array('id' => 'php:36', 'tag' => 'CCDWidth', 'categorie' => 'PhpComputed'),
561
		'FocusDistance' => array('id' => 'php:37', 'tag' => 'FocusDistance', 'categorie' => 'PhpComputed'),
562
		'Keywords' => array('id' => 'php:38', 'tag' => 'Keywords', 'categorie' => 'PhpComputed'),
563
		'GPSVersion' => array('id' => 'php:39', 'tag' => 'GPSVersion', 'categorie' => 'PhpComputed')
564
	);
1189 jpm 565
 
1198 jpm 566
	private $ids_tags_iptc = array(
567
		'1#000' => array('id' => '0', 'tag' => 'ApplicationRecordVersion', 'categorie' => 'EnvelopeRecord'),
568
		'1#090' => array('id' => '90', 'tag' => 'CodedCharacterSet', 'categorie' => 'EnvelopeRecord'),
569
		'2#003' => array('id' => '3', 'tag' => 'ObjectTypeReference', 'categorie' => 'ApplicationRecord'),
570
		'2#004' => array('id' => '4', 'tag' => 'ObjectAttributeReference', 'categorie' => 'ApplicationRecord'),
571
		'2#005' => array('id' => '5', 'tag' => 'ObjectName', 'categorie' => 'ApplicationRecord'),
572
		'2#007' => array('id' => '7', 'tag' => 'EditStatus', 'categorie' => 'ApplicationRecord'),
573
		'2#008' => array('id' => '8', 'tag' => 'EditorialUpdate', 'categorie' => 'ApplicationRecord'),
574
		'2#010' => array('id' => '10', 'tag' => 'Urgency', 'categorie' => 'ApplicationRecord'),
575
		'2#012' => array('id' => '12', 'tag' => 'SubjectReference', 'categorie' => 'ApplicationRecord'),
576
		'Category' => array('id' => '15', 'tag' => 'Category', 'categorie' => 'ApplicationRecord'),
577
		'2#015' => array('id' => '15', 'tag' => 'Category', 'categorie' => 'ApplicationRecord'),
578
		'2#020' => array('id' => '20', 'tag' => 'SupplementalCategories', 'categorie' => 'ApplicationRecord'),
579
		'2#022' => array('id' => '22', 'tag' => 'FixtureIdentifier', 'categorie' => 'ApplicationRecord'),
580
		'MotsCles' => array('id' => '25', 'tag' => 'Keywords', 'categorie' => 'ApplicationRecord'),
581
		'2#026' => array('id' => '26', 'tag' => 'ContentLocationCode', 'categorie' => 'ApplicationRecord'),
582
		'2#027' => array('id' => '27', 'tag' => 'ContentLocationName', 'categorie' => 'ApplicationRecord'),
583
		'2#030' => array('id' => '30', 'tag' => 'ReleaseDate', 'categorie' => 'ApplicationRecord'),
584
		'2#035' => array('id' => '35', 'tag' => 'ReleaseTime', 'categorie' => 'ApplicationRecord'),
585
		'2#037' => array('id' => '37', 'tag' => 'ExpirationDate', 'categorie' => 'ApplicationRecord'),
586
		'2#038' => array('id' => '38', 'tag' => 'ExpirationTime', 'categorie' => 'ApplicationRecord'),
587
		'2#040' => array('id' => '40', 'tag' => 'SpecialInstructions', 'categorie' => 'ApplicationRecord'),
588
		'2#042' => array('id' => '42', 'tag' => 'ActionAdvised', 'categorie' => 'ApplicationRecord'),
589
		'2#045' => array('id' => '45', 'tag' => 'ReferenceService', 'categorie' => 'ApplicationRecord'),
590
		'2#047' => array('id' => '47', 'tag' => 'ReferenceDate', 'categorie' => 'ApplicationRecord'),
591
		'2#050' => array('id' => '50', 'tag' => 'ReferenceNumber', 'categorie' => 'ApplicationRecord'),
592
		'2#055' => array('id' => '55', 'tag' => 'DateCreated', 'categorie' => 'ApplicationRecord'),
593
		'2#060' => array('id' => '60', 'tag' => 'TimeCreated', 'categorie' => 'ApplicationRecord'),
594
		'2#062' => array('id' => '62', 'tag' => 'DigitalCreationDate', 'categorie' => 'ApplicationRecord'),
595
		'2#063' => array('id' => '63', 'tag' => 'DigitalCreationTime', 'categorie' => 'ApplicationRecord'),
596
		'2#065' => array('id' => '65', 'tag' => 'OriginatingProgram', 'categorie' => 'ApplicationRecord'),
597
		'2#070' => array('id' => '70', 'tag' => 'ProgramVersion', 'categorie' => 'ApplicationRecord'),
598
		'2#075' => array('id' => '75', 'tag' => 'ObjectCycle', 'categorie' => 'ApplicationRecord'),
599
		'ByLine' => array('id' => '80', 'tag' => 'By-line', 'categorie' => 'ApplicationRecord'),
600
		'ByLineTitle' => array('id' => '85', 'tag' => 'By-lineTitle', 'categorie' => 'ApplicationRecord'),
601
		'City' => array('id' => '90', 'tag' => 'City', 'categorie' => 'ApplicationRecord'),
602
		'SubLocation' => array('id' => '92', 'tag' => 'Sub-location', 'categorie' => 'ApplicationRecord'),
603
		'ProvinceState' => array('id' => '95', 'tag' => 'Province-State', 'categorie' => 'ApplicationRecord'),
604
		'CountryPrimaryLocationCode' => array('id' => '100', 'tag' => 'Country-PrimaryLocationCode', 'categorie' => 'ApplicationRecord'),
605
		'CountryName' => array('id' => '101', 'tag' => 'Country-PrimaryLocationName', 'categorie' => 'ApplicationRecord'),
606
		'2#103' => array('id' => '103', 'tag' => 'OriginalTransmissionReference', 'categorie' => 'ApplicationRecord'),
607
		'Headline' => array('id' => '105', 'tag' => 'Headline', 'categorie' => 'ApplicationRecord'),
608
		'Credit' => array('id' => '110', 'tag' => 'Credit', 'categorie' => 'ApplicationRecord'),
609
		'2#115' => array('id' => '115', 'tag' => 'Source', 'categorie' => 'ApplicationRecord'),
610
		'CopyrightNotice' => array('id' => '116', 'tag' => 'CopyrightNotice', 'categorie' => 'ApplicationRecord'),
611
		'Contact' => array('id' => '118', 'tag' => 'Contact', 'categorie' => 'ApplicationRecord'),
612
		'2#120' => array('id' => '120', 'tag' => 'Caption-Abstract', 'categorie' => 'ApplicationRecord'),
613
		'2#121' => array('id' => '121', 'tag' => 'LocalCaption', 'categorie' => 'ApplicationRecord'),
614
		'2#122' => array('id' => '122', 'tag' => 'Writer-Editor', 'categorie' => 'ApplicationRecord'),
615
		'2#125' => array('id' => '125', 'tag' => 'RasterizedCaption', 'categorie' => 'ApplicationRecord'),
616
		'2#130' => array('id' => '130', 'tag' => 'ImageType', 'categorie' => 'ApplicationRecord'),
617
		'2#131' => array('id' => '131', 'tag' => 'ImageOrientation', 'categorie' => 'ApplicationRecord'),
618
		'2#135' => array('id' => '135', 'tag' => 'LanguageIdentifier', 'categorie' => 'ApplicationRecord'),
619
		'2#150' => array('id' => '150', 'tag' => 'AudioType', 'categorie' => 'ApplicationRecord'),
620
		'2#151' => array('id' => '151', 'tag' => 'AudioSamplingRate', 'categorie' => 'ApplicationRecord'),
621
		'2#152' => array('id' => '152', 'tag' => 'AudioSamplingResolution', 'categorie' => 'ApplicationRecord'),
622
		'2#153' => array('id' => '153', 'tag' => 'AudioDuration', 'categorie' => 'ApplicationRecord'),
623
		'2#154' => array('id' => '154', 'tag' => 'AudioOutcue', 'categorie' => 'ApplicationRecord'),
624
		'2#184' => array('id' => '184', 'tag' => 'JobID', 'categorie' => 'ApplicationRecord'),
625
		'2#185' => array('id' => '185', 'tag' => 'MasterDocumentID', 'categorie' => 'ApplicationRecord'),
626
		'2#186' => array('id' => '186', 'tag' => 'ShortDocumentID', 'categorie' => 'ApplicationRecord'),
627
		'2#187' => array('id' => '187', 'tag' => 'UniqueDocumentID', 'categorie' => 'ApplicationRecord'),
628
		'2#188' => array('id' => '188', 'tag' => 'OwnerID', 'categorie' => 'ApplicationRecord'),
629
		'2#200' => array('id' => '200', 'tag' => 'ObjectPreviewFileFormat', 'categorie' => 'ApplicationRecord'),
630
		'2#201' => array('id' => '201', 'tag' => 'ObjectPreviewFileVersion', 'categorie' => 'ApplicationRecord'),
631
		'2#202' => array('id' => '202', 'tag' => 'ObjectPreviewData', 'categorie' => 'ApplicationRecord'),
632
		'2#221' => array('id' => '221', 'tag' => 'Prefs', 'categorie' => 'ApplicationRecord'),
633
		'2#225' => array('id' => '225', 'tag' => 'ClassifyState', 'categorie' => 'ApplicationRecord'),
634
		'2#228' => array('id' => '228', 'tag' => 'SimilarityIndex', 'categorie' => 'ApplicationRecord'),
635
		'2#230' => array('id' => '230', 'tag' => 'DocumentNotes', 'categorie' => 'ApplicationRecord'),
636
		'2#231' => array('id' => '231', 'tag' => 'DocumentHistory', 'categorie' => 'ApplicationRecord'),
637
		'2#232' => array('id' => '232', 'tag' => 'ExifCameraInfo', 'categorie' => 'ApplicationRecord'),
638
		'2#242' => array('id' => '242', 'tag' => 'Unknown242', 'categorie' => 'Unknown'),
639
		'2#254' => array('id' => '254', 'tag' => 'Unknown254', 'categorie' => 'Unknown'),
640
		'2#255' => array('id' => '255', 'tag' => 'CatalogSets', 'categorie' => 'ApplicationRecord')
641
	);
1189 jpm 642
 
1149 gduche 643
	/**
644
	 * Méthode appelée avec une requête de type GET.
645
	 */
646
	public function getElement($params) {
1198 jpm 647
		if (!isset($this->config['database_cel']['database_migration']) || $this->config['database_cel']['database_migration'] == '') {
1160 aurelien 648
			echo 'Attention la variable de configuration database_migration dans la section database_cel, contenant la base de données d\'arrivée, doit être remplie '."\n";
649
			exit;
650
		}
1198 jpm 651
		if (!isset($this->config['database_ident']['database']) || $this->config['database_ident']['database'] == '') {
1160 aurelien 652
			echo 'Attention la variable de configuration database dans la section database_ident, contenant la base de données utilisateurs, doit être remplie '."\n";
653
			exit;
654
		}
1189 jpm 655
 
1160 aurelien 656
		self::$bdd_cel_migration = $this->config['database_cel']['database_migration'];
657
		self::$bdd_utilisateurs = $this->config['database_ident']['database'];
1189 jpm 658
 
1198 jpm 659
		$this->cle_id_metadonnees = array_merge($this->ids_tags_exif, $this->ids_tags_iptc);
1160 aurelien 660
 
661
		echo "--MIGRATION DES IMAGES --------------------------------------\n";
662
		//1. TEMPORAIRE : vider les tables de destinations
663
		if (self::truncate) {
664
			echo "-------------------------------------------------------------------\n\n";
665
			echo "  ETAPE 0. Vider les tables ... \n\n";
666
			echo "-------------------------------------------------------------------\n\n";
1189 jpm 667
			$nouvellesTables = array('cel_images', 'cel_obs_images');
1160 aurelien 668
			foreach ($nouvellesTables as $nomTable) {
669
				echo 'Vider la table '.$nomTable.'...';
670
				$requeteTruncate = 'TRUNCATE TABLE '.self::$bdd_cel_migration.'.'.$nomTable;
671
				$resultatTruncate = $this->executerRequete($requeteTruncate);
672
				echo "ok \n";
673
			}
1189 jpm 674
 
1160 aurelien 675
			echo "\n---------------------------------------------------------------- OK\n\n";
676
		}
1189 jpm 677
 
1160 aurelien 678
		echo "-------------------------------------------------------------------\n\n";
679
		echo "  ETAPE 1. Paramétrage ... \n\n";
680
		echo "-------------------------------------------------------------------\n\n";
1149 gduche 681
		$this->getUtilisateurs();
682
		$this->getObservations();
1189 jpm 683
 
1160 aurelien 684
		echo "-------------------------------------------------------------------\n\n";
685
		echo "  ETAPE 2. Migration des images ... \n\n";
686
		echo "-------------------------------------------------------------------\n\n";
687
		$this->migrerImages();
1198 jpm 688
		$this->ordonnerImages();
1149 gduche 689
		echo "\n"."\n"."\n";
1189 jpm 690
 
1160 aurelien 691
		echo "-------------------------------------------------------------------\n\n";
692
		echo "  ETAPE 3. migration des liaisons obs images ... \n\n";
693
		echo "-------------------------------------------------------------------\n\n";
1181 aurelien 694
		$this->migrerLiaisonsObsImages();
1149 gduche 695
		echo "\n"."\n"."\n";
696
	}
1189 jpm 697
 
1149 gduche 698
	private function getUtilisateurs() {
1160 aurelien 699
		echo "\n-------------------------------------------------------------------\n";
700
		echo "--SELECTION DES UTILISATEURS---------------------------------------\n\n";
1189 jpm 701
 
1198 jpm 702
		$requete = 'SELECT U_ID as id, U_MAIL as mail, U_NAME as nom, U_SURNAME as prenom, U_PASSWD as pass '.
703
			'FROM '.self::$bdd_utilisateurs.'.annuaire_tela';
704
		$tableau_utilisateurs = $this->executerRequete($requete);
1189 jpm 705
 
1198 jpm 706
		foreach ($tableau_utilisateurs as &$utilisateur) {
1149 gduche 707
			$this->tableau_utilisateurs[$utilisateur['mail']] = $utilisateur;
708
		}
1189 jpm 709
 
1160 aurelien 710
		echo sizeof($this->tableau_utilisateurs)." utilisateurs sélectionnés";
711
		echo "\n-----------------------------------------------------------------OK\n";
1149 gduche 712
	}
1189 jpm 713
 
1149 gduche 714
	private function getObservations() {
715
		$pas = 5000;
1198 jpm 716
		$nObs = 'SELECT COUNT(*) AS nb FROM cel_inventory';
1149 gduche 717
		$resultatNbObs = $this->executerRequete($nObs);
718
		$nbObs = $resultatNbObs[0]['nb'];
1198 jpm 719
		$maxLimite = $nbObs + $pas;
1189 jpm 720
 
1198 jpm 721
		for ($i = 0; $i < $maxLimite; $i += $pas ) {
1149 gduche 722
			$requete_selection_observations = 'SELECT id, ordre, identifiant FROM cel_inventory LIMIT '.$i.", $pas";
723
			$tableau_observations = $this->executerRequete($requete_selection_observations);
1198 jpm 724
			foreach ($tableau_observations as &$obs) {
1149 gduche 725
				$this->tableau_observations[$obs['identifiant']][$obs['ordre']] = $obs['id'];
726
			}
1198 jpm 727
			$this->afficherAvancement('Selection des observations (par '.$pas.' )');
1149 gduche 728
		}
1160 aurelien 729
		echo "\n\n";
1149 gduche 730
	}
1189 jpm 731
 
1149 gduche 732
	private function migrerImages() {
733
		$debut = 0;
1198 jpm 734
		$pas = 100;
1189 jpm 735
 
1160 aurelien 736
		//Selectionner le nombre d'images
737
		$requeteNbImg = "SELECT COUNT(*) as nb FROM cel_images";
738
		$resultatNbImg = $this->executerRequete($requeteNbImg);
739
		$fin = $resultatNbImg[0]['nb'];
1198 jpm 740
		$maxLimite = $fin + $pas;
1189 jpm 741
 
1198 jpm 742
		for ($i = $debut; $i <= $maxLimite ; $i += $pas) {
743
			$requete = 'SELECT * '.
744
				'FROM cel_images '.
745
				'ORDER BY ci_id_image ASC LIMIT '.$i.','.$pas;
1189 jpm 746
 
1198 jpm 747
			$images = @$this->requeter($requete);
748
			$requete = 'INSERT INTO '.self::$bdd_cel_migration.'.cel_images (';
1149 gduche 749
			foreach ($this->tableau_nouveau_ancien as $nouveau_champ => $ancien_champ) {
1198 jpm 750
				$requete .= $nouveau_champ.',';
1189 jpm 751
			}
1198 jpm 752
			$requete = rtrim($requete, ',').') VALUES ';
1189 jpm 753
 
754
			if (is_array($images)) {
1149 gduche 755
				$nb_images_a_traiter = count($images);
1198 jpm 756
				foreach ($images as $image) {
1149 gduche 757
					$nouvelle_image = $this->traiterLigneImage($image);
1198 jpm 758
					$nouvelle_image = array_map(array($this, 'protegerSiNonNull'), $nouvelle_image);
759
					$requete .= '('.join(',', array_values($nouvelle_image)).'),';
1149 gduche 760
				}
1189 jpm 761
 
1198 jpm 762
				$requete = rtrim($requete, ',');
763
				$migration_images = $this->executerRequeteSimple($requete);
1189 jpm 764
 
1149 gduche 765
				if (!$migration_images) {
1198 jpm 766
					echo 'la migration des images '.$i.' à '.($i + $nb_images_a_traiter).' a échoué '."\n";
767
					file_put_contents('/home/jpm/requete.sql', $requete);
1149 gduche 768
				} else {
1198 jpm 769
					$this->afficherAvancement('Migration des images (par '.$pas.' )');
1189 jpm 770
				}
1149 gduche 771
			}
1189 jpm 772
 
1198 jpm 773
			if (count($images) < $pas) {
1160 aurelien 774
				echo "\n---------------------------------------------------------------- OK\n\n";
1149 gduche 775
				return;
776
			}
777
		}
778
	}
1189 jpm 779
 
1198 jpm 780
	/**
781
	 * Utiliser cette méthode dans une boucle pour afficher un message suivi du nombre de tour de boucle effectué.
782
	 * Vous devrez vous même gérer le retour à la ligne à la sortie de la boucle.
783
	 *
784
	 * @param string le message d'information.
785
	 * @param int le nombre de départ à afficher.
786
	 * @return void le message est affiché dans la console.
787
	 */
788
	protected function afficherAvancement($message, $depart = 0) {
789
		if (! isset(self::$avancement[$message])) {
790
			self::$avancement[$message] = $depart;
791
			echo "$message : ";
792
 
793
			$actuel =& self::$avancement[$message];
794
			echo $actuel++;
795
		} else {
796
		$actuel =& self::$avancement[$message];
797
 
798
		// Cas du passage de 99 (= 2 caractères) à 100 (= 3 caractères)
799
		$passage = 0;
800
		if (strlen((string) ($actuel - 1)) < strlen((string) ($actuel))) {
801
		$passage = 1;
802
		}
803
		echo str_repeat(chr(8), (strlen((string) $actuel) - $passage));
804
		echo $actuel++;
805
		}
806
	}
1189 jpm 807
 
1198 jpm 808
	private function ordonnerImages() {
809
		$requete = 'ALTER TABLE '.self::$bdd_cel_migration.'.cel_images ORDER BY id_image';
810
		$this->executerRequeteSimple($requete);
811
	}
812
 
813
	public function executerRequeteSimple($requete) {
814
		// Fonction de commodité pour afficher les requetes au lieu de les executer
815
		if (self::dry_run) {
816
			echo str_replace('),','),'."\n", $requete)."\n";
817
			return true;
818
		} else {
819
			return parent::executerRequeteSimple($requete);
820
		}
1149 gduche 821
	}
1189 jpm 822
 
1149 gduche 823
	private function traiterLigneImage($image) {
824
		$nouvelle_image = array();
1189 jpm 825
 
826
		foreach ($this->tableau_nouveau_ancien as $nouveau_champ_image => $ancien_champ_image) {
1149 gduche 827
			if ($this->estUnChampATraiter($ancien_champ_image)) {
828
				if (method_exists($this,$ancien_champ_image)) {
829
					$nouvelle_image[$nouveau_champ_image] = $this->$ancien_champ_image($image);
830
				} else {
831
					echo 'methode manquante : '.$ancien_champ_image."\n";
832
					$nouvelle_image[$nouveau_champ_image] = '';
833
				}
834
			} else {
835
				$nouvelle_image[$nouveau_champ_image] = $image[$ancien_champ_image];
836
			}
837
		}
1189 jpm 838
 
1149 gduche 839
		return $nouvelle_image;
840
	}
1189 jpm 841
 
1149 gduche 842
	private function estUnChampATraiter($champ) {
843
		return strpos($champ, 'traiter') !== false;
844
	}
1189 jpm 845
 
1198 jpm 846
	private function protegerSiNonNull($valeur) {
847
		if ($valeur != 'NULL') {
848
			$valeur = $this->proteger($valeur);
1149 gduche 849
		}
1198 jpm 850
		return $valeur;
1189 jpm 851
	}
852
 
1149 gduche 853
	private function traiterIdentifiantUtilisateur($ligne_image) {
854
		$mail_image = $ligne_image['ci_ce_utilisateur'];
1181 aurelien 855
		$retour = $this->renvoyerIdPourMigration($mail_image);
1189 jpm 856
 
1149 gduche 857
		return $retour;
858
	}
1189 jpm 859
 
1198 jpm 860
	private function renvoyerIdPourMigration($utilisateur) {
861
		// si tout les test suivant échouent, on garde l'utilisateur tel quel (cas de la chaine de session des utilisateur anonymes)
862
		$retour = $utilisateur;
863
		// si le mail correspond a un utilisateur de la bdd
864
		if (isset($this->tableau_utilisateurs[$utilisateur])) {
865
			// on renvoie son id
866
			$retour =  $this->tableau_utilisateurs[$utilisateur]['id'];
867
		} else {
868
			// sinon si c'est un mail inconnu, on garde le md5
869
			if($this->mailValide($utilisateur)) {
870
				$retour = md5($utilisateur);
871
			}
872
		}
873
		return $retour;
874
	}
875
 
876
	public function mailValide($mail) {
877
		// vérification bidon mais ça suffit pour ici
878
		return !(strpos('@',$mail) === false);
879
	}
880
 
1149 gduche 881
	private function traiterPrenomUtilisateur($ligne_image) {
882
		$mail_image = $ligne_image['ci_ce_utilisateur'];
883
		$retour = $mail_image;
1189 jpm 884
 
1149 gduche 885
		if (isset($this->tableau_utilisateurs[$mail_image])) {
1198 jpm 886
			$retour = self::formaterMotPremiereLettreChaqueMotEnMajuscule($this->tableau_utilisateurs[$mail_image]['prenom']);
1181 aurelien 887
		} else {
888
			$retour = '';
1149 gduche 889
		}
1189 jpm 890
 
1149 gduche 891
		return $retour;
892
	}
1189 jpm 893
 
1198 jpm 894
	public static function formaterMotPremiereLettreChaqueMotEnMajuscule($chaine, $encodage= 'UTF-8') {
895
		$chaine = str_replace('-', ' - ', $chaine);
896
		$chaine = mb_strtolower($chaine, $encodage);
897
		$chaine = mb_convert_case($chaine, MB_CASE_TITLE, $encodage);
898
		$chaine = str_replace(' - ', '-', $chaine);
899
		return $chaine;
900
	}
901
 
1149 gduche 902
	private function traiterNomUtilisateur($ligne_image) {
903
		$mail_image = $ligne_image['ci_ce_utilisateur'];
904
		$retour = $mail_image;
1189 jpm 905
 
1149 gduche 906
		if (isset($this->tableau_utilisateurs[$mail_image])) {
1198 jpm 907
			$retour = self::formaterMotEnMajuscule($this->tableau_utilisateurs[$mail_image]['nom']);
1181 aurelien 908
		} else {
909
			$retour = '';
1149 gduche 910
		}
1189 jpm 911
 
1149 gduche 912
		return $retour;
913
	}
1189 jpm 914
 
1198 jpm 915
	public static function formaterMotEnMajuscule($chaine, $encodage= 'UTF-8') {
916
		return mb_convert_case($chaine, MB_CASE_UPPER, $encodage);
1149 gduche 917
	}
1189 jpm 918
 
1198 jpm 919
	private function traiterNoteImage($image) {
920
		$retour = $image['ci_note_image'];
921
		if ($image['ci_note_image'] == '-1') {
922
			$retour = 'NULL';
1160 aurelien 923
		}
1198 jpm 924
		return $retour;
1149 gduche 925
	}
1189 jpm 926
 
1149 gduche 927
	private function traiterExif($ligne_image) {
928
		$metadonnees_autres = $this->decoderTableauMetaDonnees($ligne_image['ci_meta_exif_autres']);
929
		$metadonnees = array_intersect_key($ligne_image, array_flip($this->champs_exifs_non_gardes))+$metadonnees_autres;
1189 jpm 930
 
1198 jpm 931
		$retour = 'NULL';
932
		if ($xml = $this->convertirTableauMetadonneesEnXml($metadonnees)) {
933
			$retour = '<?xml version="1.0" encoding="UTF-8" ?>'."\n".
934
				'<exif>'."\n".$xml.'</exif>';
935
		}
936
		return $retour;
1149 gduche 937
	}
1189 jpm 938
 
1149 gduche 939
	private function traiterIptc($ligne_image) {
940
		$metadonnees_autres = $this->decoderTableauMetaDonnees($ligne_image['ci_meta_iptc_autres']);
1198 jpm 941
		$metadonnees = array_intersect_key($ligne_image, array_flip($this->champs_iptc_non_gardes)) + $metadonnees_autres;
1189 jpm 942
 
1198 jpm 943
		$retour = 'NULL';
944
		if ($xml = $this->convertirTableauMetadonneesEnXml($metadonnees)) {
945
			$retour = '<?xml version="1.0" encoding="UTF-8" ?>'."\n".
946
				'<iptc>'."\n".$xml.'</iptc>';
947
		}
948
		return $retour;
1149 gduche 949
	}
1189 jpm 950
 
1149 gduche 951
	private function traiterXmp($ligne_image) {
1198 jpm 952
		$retour = 'NULL';
953
		return $retour;
1149 gduche 954
	}
1189 jpm 955
 
1149 gduche 956
	private function traiterMakernote($ligne_image) {
1198 jpm 957
		$retour = 'NULL';
958
		return $retour;
1149 gduche 959
	}
1189 jpm 960
 
1198 jpm 961
	private function decoderTableauMetaDonnees($chaine) {
962
		$tableau_valeurs_decodees = array();
963
		if (trim($chaine) != '') {
964
			$tableau_meta = explode(self::separateur_champs_metadonnees, $chaine);
965
			foreach ($tableau_meta as &$chaine_meta) {
966
				if (strpos($chaine_meta, 'UndefinedTag:') !== false) {
967
					$chaine_meta = str_replace('UndefinedTag:', 'UndefinedTag', $chaine_meta);
968
				}
969
				$cle_valeur = explode(self::separateur_valeurs_metadonnees, $chaine_meta, 2);
970
				if (is_array($cle_valeur) && count($cle_valeur) == 2) {
971
					$cle = ltrim($cle_valeur[0], ' ');
972
					$tableau_valeurs_decodees[$cle] = $cle_valeur[1];
973
				}
974
			}
975
		}
976
		return $tableau_valeurs_decodees;
977
	}
978
 
979
	private function convertirTableauMetadonneesEnXml($tableau) {
980
		$xml = '';
981
		foreach ($tableau as $cle => $valeur) {
982
			$cle = str_replace('ci_meta_exif_', '', $cle);
983
			$cle = str_replace('ci_meta_iptc_', '', $cle);
984
			$cle = str_replace('ci_meta_', '', $cle);
985
 
986
			$cle = str_replace('_', ' ', $cle);
987
			$cle = ucwords($cle);
988
			$cle = str_replace(' ', '', $cle);
989
 
990
			$valeur = str_replace("\0", '', $valeur);
991
 
992
			if (isset($this->cle_id_metadonnees[$cle])) {
993
				$id = $this->cle_id_metadonnees[$cle]['id'];
994
				$tag = $this->cle_id_metadonnees[$cle]['tag'];
995
				$categorie = $this->cle_id_metadonnees[$cle]['categorie'];
996
				$xml .= '<'.$tag.' id="'.$id.'" categorie="'.$categorie.'">'.$valeur.'</'.$tag.'>'."\n";
997
			} else {
998
				$xml .= '<'.$cle.' categorie="Undefined">'.$valeur.'</'.$cle.'>'."\n";
999
			}
1000
		}
1001
		return $xml;
1149 gduche 1002
	}
1189 jpm 1003
 
1198 jpm 1004
	private function migrerLiaisonsObsImages() {
1005
		$debut = 0;
1006
		$pas = 500;
1007
 
1008
		$liaisons_obs_inexistantes = 0;
1009
 
1010
		//Selectionner le nombre de liaisons
1011
		$requeteNbImgObs = "SELECT COUNT(*) AS nb FROM cel_obs_images";
1012
		$resultatNbImgObs = $this->executerRequete($requeteNbImgObs);
1013
		$fin = $resultatNbImgObs[0]['nb'];
1014
 
1015
		for ($i = $debut; $i <= $fin ; $i += $pas) {
1016
			$requete = 'SELECT * FROM cel_obs_images LIMIT '.$i.','.$pas;
1017
			$tableau_liaisons = $this->executerRequete($requete);
1018
 
1019
			if (is_array($tableau_liaisons)) {
1020
				$requete = 'INSERT INTO '.self::$bdd_cel_migration.'.cel_obs_images '.
1021
						'(id_image, id_observation, date_liaison) '.
1022
						'VALUES ';
1023
 
1024
				$sous_requete = array();
1025
				foreach ($tableau_liaisons as &$liaison) {
1026
					$mail_utilisateur = $liaison['coi_ce_utilisateur'];
1027
					$id_obs = $liaison['coi_ce_observation'];
1028
 
1029
					if (isset($this->tableau_observations[$mail_utilisateur][$id_obs])) {
1030
						$id_obs = $this->tableau_observations[$mail_utilisateur][$id_obs];
1031
 
1032
						$sous_requete[] = '('.$this->proteger($liaison['coi_ce_image']).','.
1033
							$this->proteger($id_obs).','.
1034
							$this->proteger($liaison['coi_date_liaison']).
1035
							')';
1036
					} else {
1037
						// cas d'une observation inexistante, la liaison est ignorée
1038
						$liaisons_obs_inexistantes++;
1039
					}
1040
				}
1041
				$sous_requete = implode(',', $sous_requete);
1042
				$requete .= $sous_requete;
1043
				$migration_liaison = $this->executerRequeteSimple($requete);
1044
 
1045
				if (!$migration_liaison) {
1046
					echo 'La migration des liaisons obs images de '.$i.' à '.($i+$pas).' a échoué ! '."\n<br />";
1047
				} else {
1048
					$this->afficherAvancement('Migration des liaisons obs images (par '.$pas.' )');
1049
				}
1050
			}
1051
		}
1052
		echo "\n\n";
1053
		echo $liaisons_obs_inexistantes ? $liaisons_obs_inexistantes." liaisons image obs ont été ignorées car les obs sont absentes" : '' ;
1054
		echo "\n";
1055
		echo "\n---------------------------------------------------------------- OK\n\n";
1149 gduche 1056
	}
1057
}