Subversion Repositories Sites.obs-saisons.fr

Rev

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

Rev Author Line No. Line
172 aurelien 1
<?php
2
 
289 aurelien 3
class OdsImageEspece extends JRestService {
172 aurelien 4
 
5
	private $droits = 0755;
6
	const PREFIXE = 'get';
7
 
8
	public function OdsImageEspece($config) {
9
		$this->config=$config;
10
	}
11
 
12
	/**
13
     * Méthode appelée avec une requête de type GET.
14
     *
15
     */
16
    function getElement($param = array()) {
17
 
18
    	$type = $param[0];
19
 
20
        if ($type == '*' || is_numeric($type)) {
21
            $info = $this->getElementParDefaut($param);
22
        } else {
23
            $methode = self::PREFIXE.$type;
24
            if (method_exists($this, $methode)) {
25
                array_shift($param);
26
                $info = $this->$methode($param);
27
            } else {
28
                $this->messages[] = "Le type d'information demandé '$type' n'est pas disponible.";
29
            }
30
        }
31
 
32
        // Envoi sur la sortie standard
33
        echo 'OK';
34
    }
289 aurelien 35
 
36
    /**
37
     *
38
     * Méthode appelée avec une requête de type POST.
39
     */
40
    public function createElement($params) {
41
		// fonction devant uniquement être appelée depuis le serveur
42
    	// lui-même, cad par l'application de saisie
43
    	$controle = new ControleUtilisateur($this->config);
44
    	$controle->controleAppelIpAutorisee();
45
 
46
    	$chemin_temp = $params['chemin'];
47
    	$nom_espece = $params['nom_fichier'];
48
    	$credits = $params['credits'];
49
 
50
    	$chemin_image_final = $this->stockerFichierOriginal($nom_espece, $chemin_temp);
51
    	$chemin_credits = $this->stockerCredits($nom_espece, $credits);
52
 
53
    	$this->creerMiniatures($nom_espece.'.jpg', $chemin_image_final);
54
 
55
    	echo json_encode('ok');
56
    }
57
 
58
    private function stockerFichierOriginal($nom_espece, $chemin_temp) {
59
    	$dossier = $this->config['appli']['chemin_stockage_images_especes'];
60
    	$chemin_dest = $dossier.'/'.$nom_espece.'.jpg';
61
    	copy($chemin_temp, $chemin_dest);
62
 
63
    	return $chemin_dest;
64
    }
65
 
66
 	private function stockerCredits($nom_espece, $credits) {
67
 		$dossier = $this->config['appli']['chemin_stockage_images_especes'];
68
 		$chemin_dest = $dossier.'/'.$nom_espece.'.txt';
69
 		file_put_contents($chemin_dest, $credits);
70
 	}
71
 
72
 	public function creerMiniatures($nom_fichier, $chemin) {
73
 		$formats = array('CXS','XS','S','M');
74
 		$infos_image_originale = $this->obtenirImageEtInfosPourChemin($chemin);
75
 
76
 		// creation de miniatures pour chacuns des formats définis
77
 		foreach($formats as $format) {
78
 			$this->creerEtStockerMiniatureFichierImageSelonFormat($nom_fichier, $infos_image_originale, $format);
79
 		}
80
 	}
172 aurelien 81
 
82
	public function getRecreationMiniatures() {
83
 
84
		$dossier = $this->config['appli']['chemin_stockage_images_especes'];
85
 
86
		$formats = array('CXS','XS','S','M');
87
 
88
		$dossiers_a_exclure = array();
89
 
90
		foreach (new DirectoryIterator($dossier) as $fichier_ou_dossier) {
91
 
92
			if($fichier_ou_dossier->isDot() || $fichier_ou_dossier->isDir()) {
93
				continue;
94
			}
95
 
96
			if(in_array($fichier_ou_dossier->getBasename(), $dossiers_a_exclure)) {
97
				continue;
189 aurelien 98
			}
99
 
100
			$extension = pathinfo($fichier_ou_dossier->getPathname(),PATHINFO_EXTENSION);
101
			if($extension == 'txt') {
102
				continue;
103
			}
172 aurelien 104
 
105
		    $nom_fichier = $fichier_ou_dossier->getFilename();
106
 
107
			$infos_image_originale = $this->obtenirImageEtInfosPourChemin($fichier_ou_dossier->getPathname());
108
 
289 aurelien 109
		    // creation de miniatures pour chacuns des formats définis
172 aurelien 110
			foreach($formats as $format) {
289 aurelien 111
				$this->creerEtStockerMiniatureFichierImageSelonFormat($nom_fichier, $infos_image_originale, $format);
172 aurelien 112
			}
113
		}
114
	}
115
 
116
	public function creerEtStockerMiniatureFichierImageSelonFormat($nom_fichier ,$infos_image_originale, $format = 'O') {
117
 
118
		if($format == 'O') {
119
			// format original : rien à faire
120
			$image_redimensionnee = $infos_image_originale['image'];
121
 
122
		} else {
123
			// le format carre et une image redimensionnée en gardant son ratio, insérée dans un carré blanc
124
			if($this->estUnFormatCarre($format)) {
125
				$image_redimensionnee = $this->creerMiniatureCarree($infos_image_originale, $format);
126
 
127
			} else {
128
				// la minature est une image redimensionnée en gardant son ratio
129
				$image_redimensionnee = $this->creerMiniature($infos_image_originale, $format);
130
			}
131
		}
132
 
133
		$taux_compression = 100;
134
		if($format == 'O') {
135
			$taux_compression = $this->renvoyerTauxCompressionPourPoids($infos_image_originale['poids_octets']);
136
		}
137
		$this->ecrireImageSurDisque($image_redimensionnee, $nom_fichier, $format, $taux_compression);
138
 
139
		return true;
140
	}
141
 
142
	public function creerImageRedimensionnee($infos_image_originale, $hauteur_redimension, $largeur_redimension) {
143
 
144
		$image_redimensionnee = imagecreatetruecolor($largeur_redimension, $hauteur_redimension);
145
 
146
		imagecopyresampled($image_redimensionnee,
147
						$infos_image_originale['image'],
148
						0, 0,
289 aurelien 149
						0,
150
						0,
172 aurelien 151
						$largeur_redimension,
152
						$hauteur_redimension,
153
						$infos_image_originale['largeur'],
154
						$infos_image_originale['hauteur']
155
		);
156
 
157
		return $image_redimensionnee;
158
	}
159
 
160
	public function creerMiniature($informations_images, $format) {
161
 
162
		$taille_reference_pour_format = $this->obtenirDimensionsPourFormat($format);
163
 
164
		$taille_image_redimensionnee = $this->calculerTailleImage($informations_images, $taille_reference_pour_format['hauteur']);
165
		$image_redimensionnee = $this->creerImageRedimensionnee($informations_images, $taille_image_redimensionnee['hauteur'], $taille_image_redimensionnee['largeur']);
166
 
167
		return $image_redimensionnee;
168
	}
169
 
170
	public function creerMiniatureCarree($informations_images, $format) {
171
 
172
		$taille_reference_pour_format = $this->obtenirDimensionsPourFormat($format);
173
		$cote_carre = $taille_reference_pour_format['largeur'];
174
 
175
		$image_redimensionnee_avec_rapport = $this->creerMiniature($informations_images, $format);
176
		$taille_redimensionnee_avec_rapport = $this->calculerTailleImage($informations_images, $taille_reference_pour_format['hauteur']);
177
 
178
		if($this->estPaysage($informations_images)) {
179
				$debut_largeur_a_copier = 0 ;
180
				$debut_hauteur_a_copier = ($cote_carre - $taille_redimensionnee_avec_rapport['hauteur'])/2 ;
181
		} else {
182
				$debut_largeur_a_copier = ($cote_carre - $taille_redimensionnee_avec_rapport['largeur'])/2 ;
183
				$debut_hauteur_a_copier = 0 ;
184
		}
185
 
186
		$image_carre_cible = $this->renvoyerEtCreerImageCarreeSelonFormat($cote_carre);
187
 
188
		imagecopy($image_carre_cible, $image_redimensionnee_avec_rapport,
189
				$debut_largeur_a_copier ,$debut_hauteur_a_copier, 0, 0,
190
				$taille_redimensionnee_avec_rapport['largeur'], $taille_redimensionnee_avec_rapport['hauteur']
191
		);
192
 
193
		return $image_carre_cible;
194
	}
195
 
196
	public function obtenirImageEtInfosPourChemin($chemin_fichier) {
197
 
198
		$image_et_infos = array();
199
 
200
		list($image_et_infos['largeur'], $image_et_infos['hauteur']) = getimagesize($chemin_fichier);
201
		$image_et_infos['poids_octets'] = filesize($chemin_fichier);
202
		$image_et_infos['image'] = imagecreatefromjpeg($chemin_fichier);
203
 
204
		return $image_et_infos;
205
	}
206
 
207
	public function obtenirDimensionsPourFormat($format) {
208
 
209
		$dimensions = array('largeur' => 0, 'hauteur' => 0);
210
 
211
		if(isset($this->config['appli']['format_'.$format])) {
212
 
262 gduche 213
			$format_largeur_hauteur = explode('_', $this->config['appli']['format_'.$format]);
172 aurelien 214
 
215
			$dimensions['largeur'] = $format_largeur_hauteur[0];
216
			$dimensions['hauteur'] = $format_largeur_hauteur[1];
217
		}
218
 
219
		return $dimensions;
220
 
221
	}
222
 
223
	public function calculerTailleImage($informations_images, $taille_max) {
224
 
225
	        $HL_redimension = array();
226
 
227
	        if($this->estPaysage($informations_images)) {
228
 
229
		        $rapport = $informations_images['hauteur']/$informations_images['largeur'] ;
230
		        $HL_redimension['largeur'] = round($taille_max) ;
231
		        $HL_redimension['hauteur'] = round($taille_max*$rapport) ;
232
 
233
	        } else {
234
	        	$rapport = $informations_images['largeur']/$informations_images['hauteur'] ;
235
		        $HL_redimension['hauteur'] = round($taille_max) ;
236
		        $HL_redimension['largeur'] = round($taille_max*$rapport) ;
237
	        }
238
 
239
	        return $HL_redimension;
240
	}
241
 
242
	public function estUnFormatCarre($format) {
243
 
244
		return (strpos($format,'C') === 0);
245
	}
246
 
247
	public function estPaysage($informations_images) {
248
		return $informations_images['largeur'] > $informations_images['hauteur'];
249
	}
250
 
251
	public function estPortait($informations_images) {
252
		return $informations_images['largeur'] < $informations_images['hauteur'];
253
	}
254
 
255
	public function renvoyerTauxCompressionPourPoids($poids_octets) {
256
 
257
		$poids_max_octets = $this->config['appli']['taille_max'];
258
 
259
		$ratio_compression = 100 ;
260
 
261
	    if($poids_octets >= $poids_max_octets) {
262
	      $ratio_compression = 85 ;
263
	    }
264
 
265
	    return $ratio_compression;
266
	}
267
 
268
	public function ecrireImageSurDisque($image, $nom_fichier, $format, $compression) {
269
 
270
		umask(0);
271
 
272
		$chemin_sur_serveur_final = $this->config['appli']['chemin_stockage_images_especes'].'/'.$format;
273
 
274
		if(!is_dir($chemin_sur_serveur_final)) {
275
			mkdir($chemin_sur_serveur_final,$this->droits);
276
		}
277
 
278
		if(file_exists($chemin_sur_serveur_final.'/'.$nom_fichier)) {
279
			unlink($chemin_sur_serveur_final.'/'.$nom_fichier);
280
		}
281
 
282
		imagejpeg($image, $chemin_sur_serveur_final.'/'.$nom_fichier);
283
		chmod($chemin_sur_serveur_final.'/'.$nom_fichier,$this->droits);
284
 
285
	}
286
 
287
	public function renvoyerEtCreerImageCarreeSelonFormat($cote) {
288
 
289
		$r = $g = $b = 255;
290
 
291
		if(isset($this->config['appli']['couleur_fond_carre'])) {
292
			$rgb = $this->config['appli']['couleur_fond_carre'];
293
 
294
			$r = base_convert(substr($rgb,0,2), 16, 10);
295
			$g = base_convert(substr($rgb,2,2), 16, 10);
296
			$b = base_convert(substr($rgb,4,2), 16, 10);
297
		}
298
 
299
		$image_couleur = imagecreatetruecolor($cote, $cote);
300
		$couleur = imagecolorallocate($image_couleur, $r, $g, $b);
301
		imagefilledrectangle($image_couleur, 0, 0, $cote, $cote, $couleur);
302
 
303
		return $image_couleur;
304
	}
305
 
306
	public function detruireImageEnMemoire($image) {
307
		imagedestroy($image);
308
	}
309
}
310
?>