Subversion Repositories eFlore/Applications.cel

Rev

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