Subversion Repositories eFlore/Applications.cel

Rev

Rev 2221 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2221 Rev 2239
Line 117... Line 117...
117
		}
117
		}
118
		return $image;
118
		return $image;
119
	}
119
	}
Line 120... Line 120...
120
 
120
 
-
 
121
	public function creerMiniatureImageSelonFormat($infos_image_originale, $format = 'O') {
121
	public function creerMiniatureImageSelonFormat($infos_image_originale, $format = 'O') {
122
		$image_redimensionnee = false;
122
		if ($format == 'O') {
123
		if ($format == 'O') {
123
			// format original : rien à faire
124
			// format original : rien à faire
Line 124... Line 125...
124
			$image_redimensionnee = $infos_image_originale['image'];
125
			$image_redimensionnee = $infos_image_originale['image'];
Line 128... Line 129...
128
			 	if ($this->mode == self::MODE_IMAGEMAGICK) {
129
			 	if ($this->mode == self::MODE_IMAGEMAGICK) {
129
			 		// si l'on dispose de la librairie imageMagick
130
			 		// si l'on dispose de la librairie imageMagick
130
			 		// on applique l'algorithme d'auto détection de sujets
131
			 		// on applique l'algorithme d'auto détection de sujets
131
			 		// qui centre la miniature sur le sujet de l'image
132
			 		// qui centre la miniature sur le sujet de l'image
132
			 		$image_redimensionnee = $this->opticrop($infos_image_originale, $format);
133
			 		$image_redimensionnee = $this->opticrop($infos_image_originale, $format);
133
			 	} else {
134
			 	}
-
 
135
			 	if ($image_redimensionnee === false) {
134
			 		// si l'on ne dispose que de gd
136
			 		// si l'on ne dispose que de gd ou bien que Imagick a échoué
135
					// la minature est une image redimensionnée rognée au centre
137
					// la minature est une image redimensionnée rognée au centre
136
					$image_redimensionnee = $this->creerMiniatureCarreeRognee($infos_image_originale, $format);
138
					$image_redimensionnee = $this->creerMiniatureCarreeRognee($infos_image_originale, $format);
137
			 	}
139
			 	}
138
			} else if ($this->estUnFormatCarre($format)) {
140
			} else if ($this->estUnFormatCarre($format)) {
139
				// le format carre et une image redimensionnée en gardant son ratio, insérée dans un carré blanc
141
				// le format carre et une image redimensionnée en gardant son ratio, insérée dans un carré blanc
Line 256... Line 258...
256
		$cote_carre = $taille_reference_pour_format['largeur'];
258
		$cote_carre = $taille_reference_pour_format['largeur'];
257
		$cote_carre_non_redimensionne = 0;
259
		$cote_carre_non_redimensionne = 0;
Line 258... Line 260...
258
 
260
 
259
		if ($this->estPaysage($informations_image)) {
261
		if ($this->estPaysage($informations_image)) {
260
			$cote_carre_non_redimensionne = $informations_image['hauteur'];
262
			$cote_carre_non_redimensionne = $informations_image['hauteur'];
261
			$debut_largeur_a_copier = ($informations_image['hauteur'] - $cote_carre)/2 ;
263
			$debut_largeur_a_copier = ($informations_image['largeur'] / 2) - ($informations_image['hauteur'] / 2);
Line 262... Line 264...
262
			$debut_hauteur_a_copier = 0;
264
			$debut_hauteur_a_copier = 0;
263
 
265
 
264
			if($debut_largeur_a_copier <= 0) {
266
			if($debut_largeur_a_copier <= 0) {
Line 268... Line 270...
268
			$nb_pixels_largeur_a_copier = $cote_carre_non_redimensionne;
270
			$nb_pixels_largeur_a_copier = $cote_carre_non_redimensionne;
269
			$nb_pixels_hauteur_a_copier = $cote_carre_non_redimensionne;
271
			$nb_pixels_hauteur_a_copier = $cote_carre_non_redimensionne;
270
		} else {
272
		} else {
271
			$cote_carre_non_redimensionne = $informations_image['largeur'];
273
			$cote_carre_non_redimensionne = $informations_image['largeur'];
272
			$debut_largeur_a_copier = 0 ;
274
			$debut_largeur_a_copier = 0 ;
273
			$debut_hauteur_a_copier = ($informations_image['largeur'] - $cote_carre)/2;
275
			$debut_hauteur_a_copier = ($informations_image['hauteur'] / 2) - ($informations_image['largeur'] / 2);
Line 274... Line 276...
274
 
276
 
275
			if($debut_hauteur_a_copier <= 0) {
277
			if($debut_hauteur_a_copier <= 0) {
276
				$debut_hauteur_a_copier = 0;
278
				$debut_hauteur_a_copier = 0;
Line 544... Line 546...
544
	 * $informations_image - le tableau d'informations sur l'image tel que renvoyé par la fonction obtenirImageEtInfosPourChemin
546
	 * $informations_image - le tableau d'informations sur l'image tel que renvoyé par la fonction obtenirImageEtInfosPourChemin
545
	 * $format - le format (ex. : CS, XS, XL, CRS)
547
	 * $format - le format (ex. : CS, XS, XL, CRS)
546
	*/
548
	*/
547
	public function opticrop($informations_image, $format) {
549
	public function opticrop($informations_image, $format) {
548
		umask(0);
550
		umask(0);
-
 
551
		$erreur_ecriture = false;
Line 549... Line 552...
549
 
552
 
550
		$nom_temp = md5(time());
553
		$nom_temp = md5(time());
Line 551... Line 554...
551
		$chemin_temp =
554
		$chemin_temp =
Line 579... Line 582...
579
 
582
 
580
	    // compute center of edginess
583
	    // compute center of edginess
581
	    $img->edgeImage($r);
584
	    $img->edgeImage($r);
582
	    $img->modulateImage(100,0,100); // grayscale
585
	    $img->modulateImage(100,0,100); // grayscale
583
	    $img->blackThresholdImage("#0f0f0f");
586
	    $img->blackThresholdImage("#0f0f0f");
-
 
587
	    $retour_ecriture_img = $img->writeImage($out);
-
 
588
 
-
 
589
	    if ($retour_ecriture_img !== true) {
-
 
590
	    	error_log("Erreur d'écriture Imagick : [" . $chemin_image . "] vers [" . $out . "]");
-
 
591
	    	$erreur_ecriture = true;
584
	    $img->writeImage($out);
592
	    }
585
	    // use gd for random pixel access
593
	    // use gd for random pixel access
586
	    $im = ImageCreateFromJpeg($out);
-
 
587
	    $xcenter = 0;
-
 
588
	    $ycenter = 0;
-
 
589
	    $sum = 0;
-
 
590
	    $n = 100000;
-
 
591
	    for ($k=0; $k<$n; $k++) {
-
 
592
	        $i = mt_rand(0,$largeur_image_originale-1);
-
 
593
	        $j = mt_rand(0,$hauteur_image_originale-1);
-
 
594
	        $val = imagecolorat($im, $i, $j) & 0xFF;
-
 
595
	        $sum += $val;
-
 
596
	        $xcenter += ($i+1)*$val;
-
 
597
	        $ycenter += ($j+1)*$val;
-
 
598
	    }
-
 
599
	    $xcenter /= $sum;
-
 
Line 600... Line 594...
600
	    $ycenter /= $sum;
594
	    $im = ImageCreateFromJpeg($out);
601
 
595
 
602
	    // crop source img to target AR
596
	    if ($im === false) {
603
	    if ($largeur_image_originale/$hauteur_image_originale > $ar) {
-
 
604
	        // source AR wider than target
-
 
605
	        // crop width to target AR
-
 
606
	        $wcrop0 = round($ar*$hauteur_image_originale);
-
 
607
	        $hcrop0 = $hauteur_image_originale;
-
 
608
	    } else {
-
 
609
	        // crop height to target AR
-
 
610
	        $wcrop0 = $largeur_image_originale;
597
	    	error_log("GD ne peut pas lire l'image créée par Imagick : [" . $chemin_image . "] vers [" . $out . "]");
611
	        $hcrop0 = round($largeur_image_originale/$ar);
598
	    	$erreur_ecriture = true;
-
 
599
	    }
-
 
600
	    
-
 
601
	    if (! $erreur_ecriture) {
-
 
602
		    $xcenter = 0;
-
 
603
		    $ycenter = 0;
-
 
604
		    $sum = 0;
-
 
605
		    $n = 100000;
-
 
606
		    for ($k=0; $k<$n; $k++) {
-
 
607
		        $i = mt_rand(0,$largeur_image_originale-1);
-
 
608
		        $j = mt_rand(0,$hauteur_image_originale-1);
-
 
609
		        $val = imagecolorat($im, $i, $j) & 0xFF;
-
 
610
		        $sum += $val;
-
 
611
		        $xcenter += ($i+1)*$val;
-
 
612
		        $ycenter += ($j+1)*$val;
-
 
613
		    }
-
 
614
		    $xcenter /= $sum;
-
 
615
		    $ycenter /= $sum;
-
 
616
	
-
 
617
		    // crop source img to target AR
-
 
618
		    if ($largeur_image_originale/$hauteur_image_originale > $ar) {
-
 
619
		        // source AR wider than target
-
 
620
		        // crop width to target AR
-
 
621
		        $wcrop0 = round($ar*$hauteur_image_originale);
-
 
622
		        $hcrop0 = $hauteur_image_originale;
-
 
623
		    } else {
-
 
624
		        // crop height to target AR
-
 
625
		        $wcrop0 = $largeur_image_originale;
-
 
626
		        $hcrop0 = round($largeur_image_originale/$ar);
612
	    }
627
		    }
613
 
628
	
614
	    // crop parameters for all scales and translations
629
		    // crop parameters for all scales and translations
615
	    $params = array();
630
		    $params = array();
616
 
631
	
617
	    // crop at different scales
632
		    // crop at different scales
618
	    $hgap = $hcrop0 - $hauteur_vignette;
633
		    $hgap = $hcrop0 - $hauteur_vignette;
619
	    $hinc = ($nk == 1) ? 0 : $hgap / ($nk - 1);
634
		    $hinc = ($nk == 1) ? 0 : $hgap / ($nk - 1);
620
	    $wgap = $wcrop0 - $largeur_vignette;
635
		    $wgap = $wcrop0 - $largeur_vignette;
621
	    $winc = ($nk == 1) ? 0 : $wgap / ($nk - 1);
636
		    $winc = ($nk == 1) ? 0 : $wgap / ($nk - 1);
622
 
637
	
623
	    // find window with highest normalized edginess
638
		    // find window with highest normalized edginess
624
	    $n = 10000;
639
		    $n = 10000;
625
	    $maxbetanorm = 0;
640
		    $maxbetanorm = 0;
626
	    $maxfile = '';
641
		    $maxfile = '';
627
	    $maxparam = array('w'=>0, 'h'=>0, 'x'=>0, 'y'=>0);
642
		    $maxparam = array('w'=>0, 'h'=>0, 'x'=>0, 'y'=>0);
628
 
643
	
629
	    for ($k = 0; $k < $nk; $k++) {
644
		    for ($k = 0; $k < $nk; $k++) {
630
	        $hcrop = round($hcrop0 - $k*$hinc);
645
		        $hcrop = round($hcrop0 - $k*$hinc);
631
	        $wcrop = round($wcrop0 - $k*$winc);
646
		        $wcrop = round($wcrop0 - $k*$winc);
632
	        $xcrop = $xcenter - $wcrop / 2;
647
		        $xcrop = $xcenter - $wcrop / 2;
633
	        $ycrop = $ycenter - $hcrop / 2;
648
		        $ycrop = $ycenter - $hcrop / 2;
634
	        //echo("crop: $wcrop, $hcrop, $xcrop, $ycrop");
649
		        //echo("crop: $wcrop, $hcrop, $xcrop, $ycrop");
635
 
650
	
636
	        if ($xcrop < 0) $xcrop = 0;
651
		        if ($xcrop < 0) $xcrop = 0;
637
	        if ($xcrop+$wcrop > $largeur_image_originale) $xcrop = $largeur_image_originale-$wcrop;
652
		        if ($xcrop+$wcrop > $largeur_image_originale) $xcrop = $largeur_image_originale-$wcrop;
638
	        if ($ycrop < 0) $ycrop = 0;
653
		        if ($ycrop < 0) $ycrop = 0;
639
	        if ($ycrop+$hcrop > $hauteur_image_originale) $ycrop = $hauteur_image_originale-$hcrop;
654
		        if ($ycrop+$hcrop > $hauteur_image_originale) $ycrop = $hauteur_image_originale-$hcrop;
640
 
655
	
641
	        /*if (self::MODE_DEBUG) {
656
		        /*if (self::MODE_DEBUG) {
642
	        	// debug
657
		        	// debug
643
	        	$currfile = '/home/aurelien/web/file_tmp/'."image$k.jpg";
658
		        	$currfile = '/home/aurelien/web/file_tmp/'."image$k.jpg";
644
 
659
	
645
	            $currimg = clone $img;
660
		            $currimg = clone $img;
646
	            $c= new ImagickDraw();
661
		            $c= new ImagickDraw();
647
	            $c->setFillColor("red");
662
		            $c->setFillColor("red");
648
	            $c->circle($xcenter, $ycenter, $xcenter, $ycenter+4);
663
		            $c->circle($xcenter, $ycenter, $xcenter, $ycenter+4);
649
	            $currimg->drawImage($c);
664
		            $currimg->drawImage($c);
650
	            $currimg->cropImage($wcrop, $hcrop, $xcrop, $ycrop);
665
		            $currimg->cropImage($wcrop, $hcrop, $xcrop, $ycrop);
651
	            $currimg->writeImage($currfile);
666
		            $currimg->writeImage($currfile);
652
	            $currimg->destroy();
667
		            $currimg->destroy();
653
	        }*/
668
		        }*/
654
 
669
	
655
	        $beta = 0;
670
		        $beta = 0;
656
	        for ($c=0; $c<$n; $c++) {
671
		        for ($c=0; $c<$n; $c++) {
657
	            $i = mt_rand(0,$wcrop-1);
672
		            $i = mt_rand(0,$wcrop-1);
658
	            $j = mt_rand(0,$hcrop-1);
673
		            $j = mt_rand(0,$hcrop-1);
659
	            $beta += imagecolorat($im, $xcrop+$i, $ycrop+$j) & 0xFF;
674
		            $beta += imagecolorat($im, $xcrop+$i, $ycrop+$j) & 0xFF;
660
	        }
675
		        }
661
	        $area = $wcrop * $hcrop;
676
		        $area = $wcrop * $hcrop;
662
	        $betanorm = $beta / ($n*pow($area, $gamma-1));
677
		        $betanorm = $beta / ($n*pow($area, $gamma-1));
663
	        // echo("beta: $beta; betan: $betanorm");
678
		        // echo("beta: $beta; betan: $betanorm");
664
	        // echo("image$k.jpg:<br/>\n<img src=\"$currfile\"/>");
679
		        // echo("image$k.jpg:<br/>\n<img src=\"$currfile\"/>");
665
	        // best image found, save it
680
		        // best image found, save it
666
 
681
	
667
	        if ($betanorm > $maxbetanorm) {
682
		        if ($betanorm > $maxbetanorm) {
668
 
683
	
669
	            $maxbetanorm = $betanorm;
684
		            $maxbetanorm = $betanorm;
670
	            $maxparam['w'] = $wcrop;
685
		            $maxparam['w'] = $wcrop;
671
	            $maxparam['h'] = $hcrop;
686
		            $maxparam['h'] = $hcrop;
672
	            $maxparam['x'] = $xcrop;
687
		            $maxparam['x'] = $xcrop;
673
	            $maxparam['y'] = $ycrop;
688
		            $maxparam['y'] = $ycrop;
-
 
689
		            // $maxfile = $currfile;
-
 
690
		        }
-
 
691
		    }
-
 
692
		    
-
 
693
		    // écrasement de l'image par la version "croppée"
-
 
694
	        $imgcp->cropImage($maxparam['w'], $maxparam['h'], $maxparam['x'], $maxparam['y']);
-
 
695
	        $imgcp->scaleImage($largeur_vignette, $hauteur_vignette);
-
 
696
	        $imgcp->writeImage($out);
-
 
697
 
-
 
698
	        // return image
-
 
699
		    chmod($out, 0777);
-
 
700
		    $img->destroy();
-
 
701
		    $imgcp->destroy();
-
 
702
	    	$image_sortie = ImageCreateFromJpeg($out);
-
 
703
	    } else {
-
 
704
	    	// image n'a pas pu être croppée - on retourne l'originale
674
	            // $maxfile = $currfile;
705
	    	//$image_sortie = ImageCreateFromJpeg($chemin_image);
Line 675... Line -...
675
	        }
-
 
676
	    }
-
 
677
 
-
 
678
        // return image
-
 
679
        $imgcp->cropImage($maxparam['w'], $maxparam['h'], $maxparam['x'], $maxparam['y']);
-
 
680
        $imgcp->scaleImage($largeur_vignette, $hauteur_vignette);
-
 
681
        $imgcp->writeImage($out);
-
 
682
	    chmod($out, 0777);
-
 
683
	    $img->destroy();
706
	    	$image_sortie = false;
684
	    $imgcp->destroy();
707
	    }
Line 685... Line 708...
685
 
708
 
686
	    $image_sortie = ImageCreateFromJpeg($out);
709
	    // destruction fichier temporaire dans tous les cas
687
	    unlink($out);
710
	    unlink($out);