Subversion Repositories eFlore/Applications.cel

Rev

Rev 1071 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
623 aurelien 1
<?php
2
/**
1071 jpm 3
 * Classe d'extraction de metadonnées afin de les mettre dans
623 aurelien 4
 * un tableau au format du cel
5
 * Encodage en entrée : utf8
6
 * Encodage en sortie : utf8
7
 *
8
 * @author Aurélien PERONNET <aurelien@tela-botanica.org>
9
 * @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
10
 * @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
11
 * @version $Id$
12
 */
632 aurelien 13
class ExtracteurMetadonnees {
623 aurelien 14
 
1120 jpm 15
	 public function extraireMetadonnees($chemin_fichier) {
16
		$iptc = $this->extraireIptc($chemin_fichier);
17
		$exif = $this->extraireExif($chemin_fichier);
18
		$meta = array_merge($exif, $iptc);
19
		$this->initialiserSectionsSupplementaires($meta);
20
		return $meta;
623 aurelien 21
	 }
1071 jpm 22
 
623 aurelien 23
	/**
1071 jpm 24
	* Extraction des metadonnées exif
623 aurelien 25
	**/
1071 jpm 26
	public function extraireExif($chemin_fichier) {
1120 jpm 27
		$exif_tab = $this->initialiserTableauExif ();
1071 jpm 28
		$exif = @exif_read_data($chemin_fichier,"EXIF,COMPUTED,IFD0,FILE,COMMENT", true, false);
632 aurelien 29
 
30
		if ($exif) {
1071 jpm 31
			foreach ($exif as $key => $section) {
32
			    foreach ($section as $name => $val) {
33
					if ($name != "MakerNote") {
34
							$this->decoderValeurExif($name, $val , $exif_tab);
632 aurelien 35
					}
36
			    }
37
			}
623 aurelien 38
		}
1071 jpm 39
		return $exif_tab;
623 aurelien 40
	}
1071 jpm 41
 
623 aurelien 42
	/**
1071 jpm 43
	* Extraction des metadonnées iptc
623 aurelien 44
	**/
1071 jpm 45
	public function extraireIptc($chemin_fichier) {
1120 jpm 46
		$iptc_tab = $this->initialiserTableauIptc();
1071 jpm 47
 
623 aurelien 48
		// geimagesize renvoie le infos iptc dans le tableau info
49
		$size = getimagesize($chemin_fichier, $info);
50
		// s'il existe
1120 jpm 51
		if (isset($info['APP13'])) {
623 aurelien 52
			// on parse les donnees
1120 jpm 53
			$iptc = iptcparse($info['APP13']);
632 aurelien 54
			if ($iptc) {
55
				// et on les analyse
1071 jpm 56
				foreach ($iptc as $marker => $section) {
57
					foreach ($section as $nom => $val) {
632 aurelien 58
						// pour remplir le tableau de donnees
1071 jpm 59
						$this->decoderValeurIptc($marker, $val, $iptc_tab);
632 aurelien 60
					}
623 aurelien 61
				}
62
			}
63
		}
1071 jpm 64
 
65
		return $iptc_tab;
623 aurelien 66
	}
1071 jpm 67
 
623 aurelien 68
	/**
69
	* Stocke une valeur de metadonnées exif dans le champ du tableau correspondant
70
	* @param String $nom nom de la valeur
71
	* @param String $val valeur
1071 jpm 72
	* @param String $data référence vers le tableau où la donnée sera stockée
623 aurelien 73
	**/
1071 jpm 74
	private function decoderValeurExif($nom, $val, &$data_tab) {
75
		switch ($nom) {
623 aurelien 76
			case "Height" :
77
			$data_tab['ci_meta_height'] = $val  ;
78
			break ;
1071 jpm 79
 
623 aurelien 80
			case "Width" :
81
			$data_tab['ci_meta_width'] = $val  ;
82
			break ;
1071 jpm 83
 
623 aurelien 84
			case "Make" :
85
				$data_tab['ci_meta_make'] = $val  ;
86
			break ;
1071 jpm 87
 
623 aurelien 88
			case "Model" :
89
				$data_tab['ci_meta_model'] = $val ;
90
			break ;
1071 jpm 91
 
623 aurelien 92
			case "XResolution" :
93
				$data_tab['ci_meta_x_resolution'] = $val  ;
94
			break ;
1071 jpm 95
 
623 aurelien 96
			case "YResolution" :
97
				$data_tab['ci_meta_y_resolution'] = $val ;
1071 jpm 98
			break ;
99
 
623 aurelien 100
			case "DateTimeOriginal" :
101
				$data_tab['ci_meta_date_time'] = $val  ;
102
			break ;
1071 jpm 103
 
623 aurelien 104
			case "GPS" :
105
				$data_tab['ci_meta_gps'] = $val  ;
106
			break ;
1071 jpm 107
 
623 aurelien 108
			case "UserComment" :
109
				$data_tab['ci_meta_user_comment'] = '"'.$val.'"' ;
110
			break ;
1071 jpm 111
 
623 aurelien 112
			case "ExposureTime" :
113
				$data_tab['ci_meta_exif_exposure_time'] = $val ;
114
			break ;
1071 jpm 115
 
623 aurelien 116
			case "FNumber" :
117
				$data_tab['ci_meta_exif_f_number'] = $val  ;
118
			break ;
1071 jpm 119
 
623 aurelien 120
			case "ExifVersion" :
121
				$data_tab['ci_meta_exif_exif_version'] = $val  ;
122
			break ;
1071 jpm 123
 
623 aurelien 124
			case "CompressedBitsPerPixel" :
125
				$data_tab['ci_meta_exif_compressed_bits_per_pixel'] = $val  ;
126
			break ;
1071 jpm 127
 
623 aurelien 128
			case "ShutterSpeedValue" :
129
				$data_tab['ci_meta_exif_shutter_speed_value'] = $val  ;
130
			break ;
1071 jpm 131
 
623 aurelien 132
			case "ApertureValue" :
133
				$data_tab['ci_meta_exif_aperture_value'] = $val  ;
134
			break ;
1071 jpm 135
 
623 aurelien 136
			case "ExposureBiasValue" :
137
				$data_tab['ci_meta_exif_exposure_bias_value'] = $val  ;
138
			break ;
1071 jpm 139
 
623 aurelien 140
			case "MaxApertureValue" :
141
				$data_tab['ci_meta_exif_max_aperture_value'] = $val  ;
142
			break ;
1071 jpm 143
 
623 aurelien 144
			case "MeteringMode" :
145
				$data_tab['ci_meta_exif_metering_mode'] = $val  ;
146
			break ;
1071 jpm 147
 
623 aurelien 148
			case "LightSource" :
149
				$data_tab['ci_meta_exif_light_source'] = $val  ;
150
			break ;
1071 jpm 151
 
623 aurelien 152
			case "Flash" :
153
				$data_tab['ci_meta_exif_flash'] = $val  ;
154
			break ;
1071 jpm 155
 
623 aurelien 156
			case "FocalLength" :
157
				$data_tab['ci_meta_exif_focal_length'] = $val  ;
158
			break ;
1071 jpm 159
 
623 aurelien 160
			case "FlashpixVersion" :
161
				$data_tab['ci_meta_exif_flash_pix_version'] = $val  ;
162
			break ;
1071 jpm 163
 
623 aurelien 164
			case "ColorSpace" :
165
				$data_tab['ci_meta_exif_color_space'] = $val  ;
166
			break ;
1071 jpm 167
 
623 aurelien 168
			case "InteroperabilityOffset" :
169
				$data_tab['ci_meta_exif_interoperability_offset'] = $val  ;
170
			break ;
1071 jpm 171
 
623 aurelien 172
			case "FocalPlaneXResolution" :
173
				$data_tab['ci_meta_exif_focal_plane_x_resolution'] = $val  ;
174
			break ;
1071 jpm 175
 
623 aurelien 176
			case "FocalPlaneYResolution" :
177
				$data_tab['ci_meta_exif_focal_plane_y_resolution'] = $val  ;
178
			break ;
1071 jpm 179
 
623 aurelien 180
			case "FocalPlaneResolutionUnit" :
181
				$data_tab['ci_meta_exif_focal_plane_resolution_unit'] = $val  ;
182
			break ;
1071 jpm 183
 
623 aurelien 184
			case "SensingMethod" :
185
				$data_tab['ci_meta_exif_sensing_method'] = $val  ;
186
			break ;
1071 jpm 187
 
623 aurelien 188
			case "FileSource" :
189
				$data_tab['ci_meta_exif_file_source'] = $val  ;
190
			break ;
1071 jpm 191
 
623 aurelien 192
			case "CustomRendered" :
193
				$data_tab['ci_meta_exif_custom_rendered'] = $val  ;
194
			break ;
1071 jpm 195
 
623 aurelien 196
			case "ExposureMode" :
197
				$data_tab['ci_meta_exif_exposure_mode'] = $val  ;
198
			break ;
1071 jpm 199
 
623 aurelien 200
			case "WhiteBalance" :
201
				$data_tab['ci_meta_exif_white_balance'] = $val  ;
202
			break ;
1071 jpm 203
 
623 aurelien 204
			case "DigitalZoomRatio" :
205
				$data_tab['ci_meta_exif_digital_zoom_ratio'] = $val  ;
206
			break ;
1071 jpm 207
 
623 aurelien 208
			case "SceneCaptureType" :
209
				$data_tab['ci_meta_exif_scene_capture_type'] = $val  ;
210
			break ;
1071 jpm 211
 
623 aurelien 212
			case "GainControl" :
213
				$data_tab['ci_meta_exif_gain_control'] = $val  ;
214
			break ;
1071 jpm 215
 
623 aurelien 216
			case "Contrast" :
217
				$data_tab['ci_meta_exif_contrast'] = $val  ;
218
			break ;
1071 jpm 219
 
623 aurelien 220
			case "Saturation" :
221
				$data_tab['ci_meta_exif_saturation'] = $val  ;
222
			break ;
1071 jpm 223
 
623 aurelien 224
			case "Sharpness" :
225
				$data_tab['ci_meta_exif_sharpness'] = $val  ;
226
			break ;
1071 jpm 227
 
623 aurelien 228
			case "SubjectDistanceRange" :
229
				$data_tab['ci_meta_exif_subject_distance_range'] = $val  ;
230
			break ;
1071 jpm 231
 
623 aurelien 232
			default :
233
				$data_tab['ci_meta_exif_autres'] .= $nom.":".$val.";" ;
1071 jpm 234
		}
623 aurelien 235
	}
1071 jpm 236
 
623 aurelien 237
	/**
238
	* Stocke une valeur de metadonnées iptc dans le champ du tableau correspondant
239
	* @param String $nom nom de la valeur
240
	* @param String $val valeur
241
	* @param String $data référence vers le tableau où la donnée sera stockée
242
	**/
1071 jpm 243
	private function decoderValeurIptc($nom, $val, &$data_tab) {
244
		switch($nom) {
623 aurelien 245
			// mots cles iptc
246
			case "2#005" :
247
				$data_tab['ci_meta_iptc_category'] = $val ;
248
			break;
1071 jpm 249
 
623 aurelien 250
			case "2#025" :
251
				$data_tab['ci_meta_iptc_mots_cles'] = $val ;
252
			break;
1071 jpm 253
 
623 aurelien 254
			// champ by line
255
			case "2#080" :
256
				$data_tab['ci_meta_iptc_by_line']  = $val  ;
257
			break ;
1071 jpm 258
 
623 aurelien 259
			// champ by line titre
260
			case "2#085" :
261
				$data_tab['ci_meta_iptc_by_line_title'] = $val  ;
262
			break ;
1071 jpm 263
 
623 aurelien 264
			// ville
265
			case "2#090" :
266
				$data_tab['ci_meta_iptc_city'] = $val  ;
267
			break ;
1071 jpm 268
 
623 aurelien 269
			// sous location
270
			case "2#092" :
271
				$data_tab['ci_meta_iptc_sub_location'] = $val ;
272
			break ;
1071 jpm 273
 
623 aurelien 274
			// etat (pour les us)
275
			case "2#095" :
276
				$data_tab['ci_meta_iptc_province_state'] = $val  ;
277
			break ;
1071 jpm 278
 
623 aurelien 279
			// code pays
280
			case "2#100" :
281
				$data_tab['ci_meta_iptc_country_primary_location_code'] = $val  ;
282
			break ;
1071 jpm 283
 
623 aurelien 284
			// code pays
285
			case "2#101" :
286
				$data_tab['ci_meta_iptc_country_name'] = $val  ;
287
			break ;
1071 jpm 288
 
623 aurelien 289
			// titre principal
290
			case "2#105" :
291
				$data_tab['ci_meta_iptc_headline'] = $val  ;
292
			break ;
1071 jpm 293
 
623 aurelien 294
			// credit
295
			case "2#110" :
296
				$data_tab['ci_meta_iptc_credit'] = $val  ;
297
			break ;
1071 jpm 298
 
623 aurelien 299
			// copyright
300
			case "2#116" :
301
				$data_tab['ci_meta_iptc_copyright_notice'] = $val  ;
302
			break ;
1071 jpm 303
 
623 aurelien 304
			// contact
305
			case "2#118" :
306
				$data_tab['ci_meta_iptc_contact'] = $val  ;
307
			break ;
1071 jpm 308
 
623 aurelien 309
			// autres (pour les champs qu'on ne prend pas en compte)
310
			default :
311
				$data_tab['ci_meta_iptc_autres'] .= $nom.":".$val.";" ;
312
		}
313
	}
1071 jpm 314
 
623 aurelien 315
	/**
316
	* Crée le tableau vide pour stocker les iptc pour le ce
1071 jpm 317
	*
623 aurelien 318
	* @return array $data_tab référence vers le tableau où la donnée sera stockée
1071 jpm 319
	*
623 aurelien 320
	**/
1071 jpm 321
	private function initialiserTableauIptc() {
623 aurelien 322
		$data_tab = array() ;
1071 jpm 323
 
623 aurelien 324
		$data_tab['ci_meta_iptc_category'] = NULL ;
1071 jpm 325
 
623 aurelien 326
		$data_tab['ci_meta_iptc_mots_cles'] = NULL ;
1071 jpm 327
 
623 aurelien 328
		$data_tab['ci_meta_iptc_by_line']  = NULL ;
1071 jpm 329
 
623 aurelien 330
		$data_tab['ci_meta_iptc_by_line_title'] = NULL ;
1071 jpm 331
 
623 aurelien 332
		$data_tab['ci_meta_iptc_city'] = NULL ;
1071 jpm 333
 
623 aurelien 334
		$data_tab['ci_meta_iptc_sub_location'] = NULL ;
1071 jpm 335
 
623 aurelien 336
		$data_tab['ci_meta_iptc_province_state'] = NULL ;
1071 jpm 337
 
623 aurelien 338
		$data_tab['ci_meta_iptc_country_primary_location_code'] = NULL ;
1071 jpm 339
 
623 aurelien 340
		$data_tab['ci_meta_iptc_country_name'] = NULL  ;
1071 jpm 341
 
623 aurelien 342
		$data_tab['ci_meta_iptc_headline'] = NULL ;
1071 jpm 343
 
623 aurelien 344
		$data_tab['ci_meta_iptc_credit'] = NULL ;
1071 jpm 345
 
623 aurelien 346
		$data_tab['ci_meta_iptc_copyright_notice'] = NULL ;
1071 jpm 347
 
623 aurelien 348
		$data_tab['ci_meta_iptc_contact'] = NULL ;
1071 jpm 349
 
350
		$data_tab['ci_meta_iptc_autres'] = " ";
351
 
352
		return $data_tab ;
623 aurelien 353
	}
1071 jpm 354
 
623 aurelien 355
	/**
356
	* Crée le tableau vide pour stocker les exifs pour le cel
1071 jpm 357
	*
623 aurelien 358
	* @return array $data_tab référence vers le tableau où la donnée sera stockée
1071 jpm 359
	*
623 aurelien 360
	**/
1071 jpm 361
	private function initialiserTableauExif() {
623 aurelien 362
		$data_tab = array() ;
1071 jpm 363
 
623 aurelien 364
		$data_tab['ci_meta_height'] = 0  ;
1071 jpm 365
 
623 aurelien 366
		$data_tab['ci_meta_width'] = 0  ;
1071 jpm 367
 
623 aurelien 368
		$data_tab['ci_meta_make'] = NULL ;
1071 jpm 369
 
623 aurelien 370
		$data_tab['ci_meta_model'] = NULL ;
1071 jpm 371
 
623 aurelien 372
		$data_tab['ci_meta_x_resolution'] = NULL ;
1071 jpm 373
 
623 aurelien 374
		$data_tab['ci_meta_y_resolution'] = NULL ;
1071 jpm 375
 
623 aurelien 376
		$data_tab['ci_meta_date_time'] = NULL ;
1071 jpm 377
 
623 aurelien 378
		$data_tab['ci_meta_gps'] = NULL ;
1071 jpm 379
 
623 aurelien 380
		$data_tab['ci_meta_user_comment'] = NULL ;
1071 jpm 381
 
623 aurelien 382
		$data_tab['ci_meta_exif_exposure_time'] = NULL ;
1071 jpm 383
 
623 aurelien 384
		$data_tab['ci_meta_exif_f_number'] = NULL ;
1071 jpm 385
 
623 aurelien 386
		$data_tab['ci_meta_exif_exif_version'] = NULL ;
1071 jpm 387
 
623 aurelien 388
		$data_tab['ci_meta_exif_compressed_bits_per_pixel'] = NULL ;
1071 jpm 389
 
623 aurelien 390
		$data_tab['ci_meta_exif_shutter_speed_value'] = NULL ;
1071 jpm 391
 
623 aurelien 392
		$data_tab['ci_meta_exif_aperture_value'] = NULL ;
1071 jpm 393
 
623 aurelien 394
		$data_tab['ci_meta_exif_exposure_bias_value'] = NULL ;
1071 jpm 395
 
623 aurelien 396
		$data_tab['ci_meta_exif_max_aperture_value'] = NULL ;
1071 jpm 397
 
623 aurelien 398
		$data_tab['ci_meta_exif_metering_mode'] = NULL ;
1071 jpm 399
 
623 aurelien 400
		$data_tab['ci_meta_exif_flash'] = NULL ;
1071 jpm 401
 
623 aurelien 402
		$data_tab['ci_meta_exif_light_source'] = NULL ;
1071 jpm 403
 
623 aurelien 404
		$data_tab['ci_meta_exif_focal_length'] = NULL ;
1071 jpm 405
 
623 aurelien 406
		$data_tab['ci_meta_exif_flash_pix_version'] = NULL ;
1071 jpm 407
 
623 aurelien 408
		$data_tab['ci_meta_exif_color_space'] = NULL ;
1071 jpm 409
 
623 aurelien 410
		$data_tab['ci_meta_exif_interoperability_offset'] = NULL ;
1071 jpm 411
 
623 aurelien 412
		$data_tab['ci_meta_exif_focal_plane_x_resolution'] = NULL ;
1071 jpm 413
 
623 aurelien 414
		$data_tab['ci_meta_exif_focal_plane_y_resolution'] = NULL ;
1071 jpm 415
 
623 aurelien 416
		$data_tab['ci_meta_exif_focal_plane_resolution_unit'] = NULL ;
1071 jpm 417
 
623 aurelien 418
		$data_tab['ci_meta_exif_sensing_method'] = NULL ;
1071 jpm 419
 
623 aurelien 420
		$data_tab['ci_meta_exif_file_source'] = NULL ;
1071 jpm 421
 
623 aurelien 422
		$data_tab['ci_meta_exif_custom_rendered'] = NULL ;
1071 jpm 423
 
623 aurelien 424
		$data_tab['ci_meta_exif_exposure_mode'] = NULL ;
1071 jpm 425
 
426
		$data_tab['ci_meta_exif_white_balance'] = NULL ;
427
 
623 aurelien 428
		$data_tab['ci_meta_exif_digital_zoom_ratio'] = NULL ;
1071 jpm 429
 
623 aurelien 430
		$data_tab['ci_meta_exif_scene_capture_type'] = NULL ;
1071 jpm 431
 
623 aurelien 432
		$data_tab['ci_meta_exif_gain_control'] = NULL ;
1071 jpm 433
 
623 aurelien 434
		$data_tab['ci_meta_exif_contrast'] = NULL ;
1071 jpm 435
 
623 aurelien 436
		$data_tab['ci_meta_exif_saturation'] = NULL ;
1071 jpm 437
 
623 aurelien 438
		$data_tab['ci_meta_exif_sharpness'] = NULL ;
1071 jpm 439
 
623 aurelien 440
		$data_tab['ci_meta_exif_subject_distance_range'] = NULL ;
1071 jpm 441
 
442
		$data_tab['ci_meta_exif_autres'] = " ";
443
 
444
		return $data_tab ;
623 aurelien 445
	}
1071 jpm 446
 
623 aurelien 447
	/**
448
	* Crée le tableau vide pour stocker les section supplémentaires pour le cel
1071 jpm 449
	*
623 aurelien 450
	* @return array $tab référence vers le tableau de metadonnées
1071 jpm 451
	*
623 aurelien 452
	**/
1071 jpm 453
	private function InitialiserSectionsSupplementaires(&$tab) {
623 aurelien 454
		$tab['ci_meta_exif_autres'] .= " " ;
455
		$tab['ci_meta_iptc_autres'] .= " " ;
456
		$tab['ci_nom_original'] = NULL ;
457
		$tab['ci_md5'] = NULL ;
458
	}
459
}
460
?>