Subversion Repositories eFlore/Applications.cel

Rev

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