Subversion Repositories Sites.obs-saisons.fr

Rev

Rev 189 | Go to most recent revision | Details | Last modification | View Log | RSS feed

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