Subversion Repositories eFlore/Applications.cel

Rev

Rev 2459 | Rev 2662 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2459 Rev 2462
Line 1... Line 1...
1
<?php
1
<?php
-
 
2
// declare(encoding='UTF-8');
-
 
3
/**
-
 
4
 * Classe de manipulation des fichiers images JPEG.
-
 
5
 *
-
 
6
 * @internal   Mininum PHP version : 5.2
-
 
7
 * @category   CEL
-
 
8
 * @package    Services
-
 
9
 * @subpackage Bibliothèques
-
 
10
 * @version    0.1
-
 
11
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
-
 
12
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
-
 
13
 * @author     Aurelien PERONNET <aurelien@tela-botanica.org>
-
 
14
 * @license    GPL v3 <http://www.gnu.org/licenses/gpl.txt>
-
 
15
 * @license    CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
-
 
16
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
-
 
17
 */
2
Class ImageRecreation {
18
Class ImageRecreation {
Line 3... Line 19...
3
 
19
 
4
	private $droits = 0755;
20
	private $droits = 0755;
5
	private $formats = array('CRX2S','CRXS','CXS','CS','CRS','XS','S','M','L','XL','X2L','X3L');
21
	private $formats = array('CRX2S','CRXS','CXS','CS','CRS','XS','S','M','L','XL','X2L','X3L');
Line 37... Line 53...
37
 
53
 
38
	public function regenererMiniaturesPourId($params) {
54
	public function regenererMiniaturesPourId($params) {
Line 39... Line 55...
39
		$id = $params[0];
55
		$id = $params[0];
40
 
56
 
41
		if (!is_numeric($id)) {
57
		if (!is_numeric($id)) {
Line 42... Line 58...
42
		      return;
58
			return;
43
		}
59
		}
Line 52... Line 68...
52
 
68
 
53
			// creation de miniatures pour chacuns des formats définis
69
			// creation de miniatures pour chacuns des formats définis
54
			foreach ($this->formats as $format) {
70
			foreach ($this->formats as $format) {
55
				$this->creerEtStockerMiniatureFichierImageSelonFormat($id, $infos_image_originale, $format);
71
				$this->creerEtStockerMiniatureFichierImageSelonFormat($id, $infos_image_originale, $format);
56
			};
-
 
57
 
72
			};
58
		}
73
		}
Line 59... Line 74...
59
	}
74
	}
60
 
75
 
Line 69... Line 84...
69
 
84
 
70
			if (in_array($fichier_ou_dossier->getBasename(), $dossiers_a_exclure)) {
85
			if (in_array($fichier_ou_dossier->getBasename(), $dossiers_a_exclure)) {
71
				continue;
86
				continue;
Line 72... Line 87...
72
			}
87
			}
73
 
88
 
74
		    if ($fichier_ou_dossier->isDir()) {
89
			if ($fichier_ou_dossier->isDir()) {
75
	    		$this->itererRecursivement($fichier_ou_dossier->getPathname());
90
				$this->itererRecursivement($fichier_ou_dossier->getPathname());
Line 76... Line 91...
76
		    } else {
91
			} else {
77
		    	$nom_fichier = $fichier_ou_dossier->getFilename();
92
				$nom_fichier = $fichier_ou_dossier->getFilename();
Line 78... Line 93...
78
 
93
 
79
				$infos_image_originale = $this->obtenirImageEtInfosPourChemin($fichier_ou_dossier->getPathname());
94
				$infos_image_originale = $this->obtenirImageEtInfosPourChemin($fichier_ou_dossier->getPathname());
80
		    	$id = $this->convertirBaseNomFichierVersIdBdd($nom_fichier, $this->formats);
95
				$id = $this->convertirBaseNomFichierVersIdBdd($nom_fichier, $this->formats);
81
 
96
 
82
		    	// creation de miniatures pour chacuns des formats définis
97
				// creation de miniatures pour chacuns des formats définis
83
				foreach ($this->formats as $format) {
98
				foreach ($this->formats as $format) {
84
					$this->creerEtStockerMiniatureFichierImageSelonFormat($id, $infos_image_originale, $format);
99
					$this->creerEtStockerMiniatureFichierImageSelonFormat($id, $infos_image_originale, $format);
85
				}
100
				}
86
		    }
101
			}
87
		}
102
		}
88
	}
103
	}
89
	
104
 
Line 90... Line 105...
90
	public function creerOuRenvoyerImage($id, $format) {
105
	public function creerOuRenvoyerImage($id, $format) {
91
		$dossier = $this->obtenirDossierPourFormat($id, $format);
106
		$dossier = $this->obtenirDossierPourFormat($id, $format);
92
		$nom_fichier = $this->convertirIdBddVersNomFichier($id, $format);
107
		$nom_fichier = $this->convertirIdBddVersNomFichier($id, $format);
93
		$chemin_image = $dossier.'/'.$nom_fichier;	
108
		$chemin_image = $dossier.'/'.$nom_fichier;
94
 
109
 
95
		$image = false;
110
		$image = false;
96
		if(!file_exists($chemin_image)) {
111
		if (!file_exists($chemin_image)) {
97
			$chemin_image_originale = $this->obtenirCheminImageOriginale($id);
112
			$chemin_image_originale = $this->obtenirCheminImageOriginale($id);
98
			$infos_image_originale = $this->obtenirImageEtInfosPourChemin($chemin_image_originale);
113
			$infos_image_originale = $this->obtenirImageEtInfosPourChemin($chemin_image_originale);
99
			if($infos_image_originale) {
114
			if($infos_image_originale) {
100
				// le verrou est là dans le (rare) cas où l'image est déjà en train
115
				// le verrou est là dans le (rare) cas où l'image est déjà en train
101
				// d'être générée par le script de création des miniatures ou bien 
116
				// d'être générée par le script de création des miniatures ou bien
102
				// un autre instance de cette classe appelée par le web service
117
				// un autre instance de cette classe appelée par le web service
103
				$fp = fopen($chemin_image_originale, "r");
118
				$fp = fopen($chemin_image_originale, "r");
104
				// si le fichier est verrouillé, flock attendra qu'il se libère 
119
				// si le fichier est verrouillé, flock attendra qu'il se libère
Line 121... Line 136...
121
	public function creerMiniatureImageSelonFormat($infos_image_originale, $format = 'O') {
136
	public function creerMiniatureImageSelonFormat($infos_image_originale, $format = 'O') {
122
		$image_redimensionnee = false;
137
		$image_redimensionnee = false;
123
		if ($format == 'O') {
138
		if ($format == 'O') {
124
			// format original : rien à faire
139
			// format original : rien à faire
125
			$image_redimensionnee = $infos_image_originale['image'];
140
			$image_redimensionnee = $infos_image_originale['image'];
126
 
-
 
127
		} else {
141
		} else {
128
			 if ($this->estUnFormatRogne($format)) {
142
			 if ($this->estUnFormatRogne($format)) {
129
			 	if ($this->mode == self::MODE_IMAGEMAGICK) {
143
			 	if ($this->mode == self::MODE_IMAGEMAGICK) {
130
			 		// si l'on dispose de la librairie imageMagick
144
			 		// si l'on dispose de la librairie imageMagick
131
			 		// on applique l'algorithme d'auto détection de sujets
145
			 		// on applique l'algorithme d'auto détection de sujets
Line 142... Line 156...
142
				$image_redimensionnee = $this->creerMiniatureCarree($infos_image_originale, $format);
156
				$image_redimensionnee = $this->creerMiniatureCarree($infos_image_originale, $format);
143
			} else {
157
			} else {
144
				$image_redimensionnee = $this->creerMiniature($infos_image_originale, $format);
158
				$image_redimensionnee = $this->creerMiniature($infos_image_originale, $format);
145
			}
159
			}
146
		}
160
		}
147
 
-
 
148
		return $image_redimensionnee;
161
		return $image_redimensionnee;
149
	}
162
	}
Line 150... Line 163...
150
 
163
 
151
	/**
164
	/**
152
	 * Déplace une image temporaire uploadée vers le répertoire de stockage d'images,
165
	 * Déplace une image temporaire uploadée vers le répertoire de stockage d'images,
153
	 * en enregistrant les métadonnées et tout le tintouin.
166
	 * en enregistrant les métadonnées et tout le tintouin.
154
	 * Si $conserverFichiersTemporaires vaut true, l'image est copiée et non déplacée.
167
	 * Si $conserverFichiersTemporaires vaut true, l'image est copiée et non déplacée.
155
	 * 
168
	 *
156
	 * @param unknown $fichier
169
	 * @param unknown $fichier
157
	 * @param unknown $id
170
	 * @param unknown $id
158
	 * @param unknown $conserverFichiersTemporaires
171
	 * @param unknown $conserverFichiersTemporaires
159
	 * @return Ambigous <multitype:, boolean>|boolean
172
	 * @return Ambigous <multitype:, boolean>|boolean
160
	 */
173
	 */
161
	public function stockerFichierOriginal($fichier, $id, $conserverFichiersTemporaires=false) {
174
	public function stockerFichierOriginal($fichier, $id, $conserverFichiersTemporaires=false) {
162
		$chemin_fichier_origine = is_array($fichier) ? $fichier['tmp_name'] : $fichier;
175
		$chemin_fichier_origine = is_array($fichier) ? $fichier['tmp_name'] : $fichier;
163
		
176
 
164
		$chemin_base_fichier = $this->creerSiNecessaireEtRenvoyerCheminStockageFichierPourIdEtFormat($id, 'O');
177
		$chemin_base_fichier = $this->creerSiNecessaireEtRenvoyerCheminStockageFichierPourIdEtFormat($id, 'O');
165
		$nom_fichier = $this->convertirIdBddVersNomFichier($id, 'O');
178
		$nom_fichier = $this->convertirIdBddVersNomFichier($id, 'O');
166
		
179
 
167
		$chemin_fichier = $chemin_base_fichier.'/'.$nom_fichier;
180
		$chemin_fichier = $chemin_base_fichier.'/'.$nom_fichier;
168
		
181
 
169
		$deplacement_fichier = $this->stockerImageExterne($chemin_fichier_origine, $chemin_fichier, $conserverFichiersTemporaires);
182
		$deplacement_fichier = $this->stockerImageExterne($chemin_fichier_origine, $chemin_fichier, $conserverFichiersTemporaires);
170
		
183
 
171
		if ($deplacement_fichier) {
184
		if ($deplacement_fichier) {
172
			$infos_image_originale = $this->obtenirImageEtInfosPourChemin($chemin_fichier);
185
			$infos_image_originale = $this->obtenirImageEtInfosPourChemin($chemin_fichier);
173
			$taux_compression = $this->renvoyerTauxCompressionPourPoids($infos_image_originale['poids_octets']);
186
			$taux_compression = $this->renvoyerTauxCompressionPourPoids($infos_image_originale['poids_octets']);
174
		
187
 
175
			if ($taux_compression < 100 && $this->mode == self::MODE_IMAGEMAGICK) {
188
			if ($taux_compression < 100 && $this->mode == self::MODE_IMAGEMAGICK) {
176
				$this->ecrireImageSurDisqueAvecMeta($chemin_fichier, $taux_compression);
189
				$this->ecrireImageSurDisqueAvecMeta($chemin_fichier, $taux_compression);
Line 177... Line 190...
177
			}
190
			}
178
 
191
 
179
			return $infos_image_originale;
192
			return $infos_image_originale;
180
		
193
 
181
		} else {
194
		} else {
182
			$erreur =  'ERROR : probleme durant le déplacement du fichier temporaire \n' ;
195
			$erreur =  'ERROR : probleme durant le déplacement du fichier temporaire \n' ;
183
			$this->logger('CEL_bugs',$erreur);
196
			$this->logger('CEL_bugs',$erreur);
184
			return false ;
197
			return false ;
185
		}
198
		}
186
	}
199
	}
187
	
-
 
188
	public function stockerFichierEtCreerMiniatures($fichier, $id) {
200
 
189
		
201
	public function stockerFichierEtCreerMiniatures($fichier, $id) {
190
		$infos_image_originale_stockee = $this->stockerFichierOriginal($fichier, $id);
202
		$infos_image_originale_stockee = $this->stockerFichierOriginal($fichier, $id);
191
		if($infos_image_originale_stockee) {
203
		if ($infos_image_originale_stockee) {
192
			$formats = $this->getFormats();
204
			$formats = $this->getFormats();
193
	
205
 
194
			// creation de miniatures pour chacuns des formats définis
206
			// creation de miniatures pour chacuns des formats définis
195
			foreach($formats as $format) {
207
			foreach($formats as $format) {
196
				$this->creerEtStockerMiniatureFichierImageSelonFormat($id, $infos_image_originale_stockee, $format);
208
				$this->creerEtStockerMiniatureFichierImageSelonFormat($id, $infos_image_originale_stockee, $format);
197
			}
209
			}
198
		} else {
210
		} else {
199
			$erreur =  'ERROR : impossible d\'obtenir les informations sur l\'image originale \n' ;
211
			$erreur =  'ERROR : impossible d\'obtenir les informations sur l\'image originale \n' ;
200
			$this->logger('CEL_bugs',$erreur);
212
			$this->logger('CEL_bugs',$erreur);
201
			return false ;
-
 
202
		}
213
			return false ;
203
	
214
		}
Line 204... Line 215...
204
		return true ;
215
		return true ;
205
	}
216
	}
206
 
-
 
207
	public function creerEtStockerMiniatureFichierImageSelonFormat($id ,$infos_image_originale, $format = 'O') {
217
 
208
		$image_redimensionnee = $this->creerMiniatureImageSelonFormat($infos_image_originale, $format);
218
	public function creerEtStockerMiniatureFichierImageSelonFormat($id ,$infos_image_originale, $format = 'O') {
209
 
-
 
210
		$taux_compression = $this->renvoyerTauxCompressionPourPoids($infos_image_originale['poids_octets']);
219
		$image_redimensionnee = $this->creerMiniatureImageSelonFormat($infos_image_originale, $format);
211
		$this->ecrireImageSurDisque($image_redimensionnee, $id, $format, $taux_compression);
220
		$taux_compression = $this->renvoyerTauxCompressionPourPoids($infos_image_originale['poids_octets']);
Line 212... Line 221...
212
 
221
		$this->ecrireImageSurDisque($image_redimensionnee, $id, $format, $taux_compression);
213
		return true;
222
		return true;
Line 223... Line 232...
223
			$largeur_redimension,
232
			$largeur_redimension,
224
			$hauteur_redimension,
233
			$hauteur_redimension,
225
			$infos_image_originale['largeur'],
234
			$infos_image_originale['largeur'],
226
			$infos_image_originale['hauteur']
235
			$infos_image_originale['hauteur']
227
		);
236
		);
228
 
-
 
229
		return $image_redimensionnee;
237
		return $image_redimensionnee;
230
	}
238
	}
Line 231... Line 239...
231
 
239
 
232
	public function creerMiniature($informations_images, $format) {
240
	public function creerMiniature($informations_images, $format) {
Line 321... Line 329...
321
	}
329
	}
Line 322... Line 330...
322
 
330
 
323
	/**
331
	/**
324
	 * Déplace un fichier temporaire vers une destination donnée. Si
332
	 * Déplace un fichier temporaire vers une destination donnée. Si
325
	 * $conserverFichiersTemporaires vaut true, le fichier est copié et non déplacé.
333
	 * $conserverFichiersTemporaires vaut true, le fichier est copié et non déplacé.
326
	 * 
334
	 *
327
	 * @param unknown $chemin_fichier_temp
335
	 * @param unknown $chemin_fichier_temp
328
	 * @param unknown $chemin_destination
336
	 * @param unknown $chemin_destination
329
	 * @param string $conserverFichiersTemporaires
337
	 * @param string $conserverFichiersTemporaires
330
	 * @return boolean
338
	 * @return boolean
Line 409... Line 417...
409
 
417
 
410
		return $dimensions;
418
		return $dimensions;
Line 411... Line 419...
411
	}
419
	}
412
 
420
 
-
 
421
	public function calculerTailleImage($informations_images, $taille_max) {
-
 
422
		$HL_redimension = array();
-
 
423
 
-
 
424
		if ($this->estPaysage($informations_images)) {
-
 
425
			$rapport = $informations_images['hauteur']/$informations_images['largeur'] ;
Line 413... Line -...
413
	public function calculerTailleImage($informations_images, $taille_max) {
-
 
414
        $HL_redimension = array();
-
 
415
 
-
 
416
        if ($this->estPaysage($informations_images)) {
-
 
417
	        $rapport = $informations_images['hauteur']/$informations_images['largeur'] ;
-
 
418
	        $HL_redimension['largeur'] = round($taille_max) ;
426
			$HL_redimension['largeur'] = round($taille_max) ;
419
	        $HL_redimension['hauteur'] = round($taille_max*$rapport) ;
427
			$HL_redimension['hauteur'] = round($taille_max*$rapport) ;
420
 
428
 
421
        } else {
429
		} else {
422
        	$rapport = $informations_images['largeur']/$informations_images['hauteur'] ;
430
			$rapport = $informations_images['largeur']/$informations_images['hauteur'] ;
Line 423... Line 431...
423
	        $HL_redimension['hauteur'] = round($taille_max) ;
431
			$HL_redimension['hauteur'] = round($taille_max) ;
424
	        $HL_redimension['largeur'] = round($taille_max*$rapport) ;
432
			$HL_redimension['largeur'] = round($taille_max*$rapport) ;
Line 425... Line 433...
425
        }
433
		}
426
 
434
 
427
        return $HL_redimension;
435
		return $HL_redimension;
Line 450... Line 458...
450
	public function renvoyerTauxCompressionPourPoids($poids_octets) {
458
	public function renvoyerTauxCompressionPourPoids($poids_octets) {
451
		$poids_max_octets = $this->config['cel']['taille_max'];
459
		$poids_max_octets = $this->config['cel']['taille_max'];
Line 452... Line 460...
452
 
460
 
Line 453... Line 461...
453
		$ratio_compression = 100 ;
461
		$ratio_compression = 100 ;
454
 
462
 
455
	    if ($poids_octets >= $poids_max_octets) {
463
		if ($poids_octets >= $poids_max_octets) {
Line 456... Line 464...
456
	      $ratio_compression = 75 ;
464
			$ratio_compression = 75 ;
457
	    }
465
		}
Line 458... Line 466...
458
 
466
 
459
	    return $ratio_compression;
467
		return $ratio_compression;
460
	}
468
	}
Line 470... Line 478...
470
	}
478
	}
Line 471... Line 479...
471
 
479
 
472
	public function convertirBaseNomFichierVersIdBdd($nom_fichier, $formats) {
480
	public function convertirBaseNomFichierVersIdBdd($nom_fichier, $formats) {
Line 473... Line 481...
473
		$nom_fichier_sans_extension = trim($nom_fichier, '.jpg');
481
		$nom_fichier_sans_extension = trim($nom_fichier, '.jpg');
474
 
482
 
475
		foreach($formats as $format) {
483
		foreach ($formats as $format) {
476
			$nom_fichier_sans_extension = trim($nom_fichier_sans_extension, '_'.$format);
-
 
477
		}
484
			$nom_fichier_sans_extension = trim($nom_fichier_sans_extension, '_'.$format);
Line 478... Line 485...
478
 
485
		}
479
		$id_image = str_replace('_', '', $nom_fichier_sans_extension);
486
		$id_image = str_replace('_', '', $nom_fichier_sans_extension);
Line 501... Line 508...
501
 
508
 
502
	public function ecrireImageSurDisqueAvecMeta($chemin_image_a_stocker, $compression = 100) {
509
	public function ecrireImageSurDisqueAvecMeta($chemin_image_a_stocker, $compression = 100) {
Line 503... Line 510...
503
		$img = new Imagick($chemin_image_a_stocker);
510
		$img = new Imagick($chemin_image_a_stocker);
504
 
511
 
505
		// l'utilisation d'image magick préserve les métadonnées lors d'une recompression
512
		// l'utilisation d'image magick préserve les métadonnées lors d'une recompression
506
		$img->setformat("jpeg");
513
		$img->setformat('jpeg');
507
		$img->setImageCompression(imagick::COMPRESSION_JPEG);
514
		$img->setImageCompression(imagick::COMPRESSION_JPEG);
508
		$img->setCompressionQuality($compression);
515
		$img->setCompressionQuality($compression);
Line 514... Line 521...
514
 
521
 
515
	public function renvoyerEtCreerImageCarreeBlancheSelonFormat($cote) {
522
	public function renvoyerEtCreerImageCarreeBlancheSelonFormat($cote) {
516
		$image_blanche = imagecreatetruecolor($cote, $cote);
523
		$image_blanche = imagecreatetruecolor($cote, $cote);
517
		$blanc = imagecolorallocate($image_blanche, 255, 255, 255);
524
		$blanc = imagecolorallocate($image_blanche, 255, 255, 255);
518
		imagefilledrectangle($image_blanche, 0, 0, $cote, $cote, $blanc);
-
 
519
 
525
		imagefilledrectangle($image_blanche, 0, 0, $cote, $cote, $blanc);
520
		return $image_blanche;
526
		return $image_blanche;
Line 521... Line 527...
521
	}
527
	}
522
 
528
 
523
	public function detruireImageEnMemoire($image) {
529
	public function detruireImageEnMemoire($image) {
Line 524... Line 530...
524
		imagedestroy($image);
530
		imagedestroy($image);
525
	}
531
	}
526
 
532
 
527
	/**
533
	/**
528
	 * Supprime une image du disque, ainsi que tous les formats générés
534
	 * Supprime une image du disque, ainsi que tous les formats générés
529
	 * 
535
	 *
530
	 * @param Integer $id
536
	 * @param Integer $id
531
	 * @return boolean true si tous les formats y compris l'original ont été détruits, false s'il en reste au moins un
537
	 * @return boolean true si tous les formats y compris l'original ont été détruits, false s'il en reste au moins un
Line 550... Line 556...
550
		return $destruction_formats_fichier;
556
		return $destruction_formats_fichier;
551
	}
557
	}
Line 552... Line 558...
552
 
558
 
553
	// recopie de Cel->logger() (pas d'extends pour ça)
559
	// recopie de Cel->logger() (pas d'extends pour ça)
554
	public function logger($index,$chaine) {
560
	public function logger($index,$chaine) {
555
		if(!class_exists('Log')) {
561
		if (!class_exists('Log')) {
556
			Log::getInstance();
562
			Log::getInstance();
Line 557... Line 563...
557
		}
563
		}
558
 
564
 
Line 584... Line 590...
584
		$dimension_vignettes = $this->obtenirDimensionsPourFormat($format);
590
		$dimension_vignettes = $this->obtenirDimensionsPourFormat($format);
Line 585... Line 591...
585
 
591
 
586
		$largeur_vignette = $dimension_vignettes['largeur'];
592
		$largeur_vignette = $dimension_vignettes['largeur'];
Line 732... Line 721...
732
	    	$image_sortie = false;
721
			$image_sortie = false;
733
	    }
722
		}
Line 734... Line 723...
734
 
723
 
735
	    // destruction fichier temporaire dans tous les cas
724
		// destruction fichier temporaire dans tous les cas
736
	    unlink($out);
-
 
737
 
-
 
738
	    return $image_sortie;
725
		unlink($out);
-
 
726
 
739
	}
727
		return $image_sortie;