119,6 → 119,7 |
} |
|
public function creerMiniatureImageSelonFormat($infos_image_originale, $format = 'O') { |
$image_redimensionnee = false; |
if ($format == 'O') { |
// format original : rien à faire |
$image_redimensionnee = $infos_image_originale['image']; |
130,8 → 131,9 |
// on applique l'algorithme d'auto détection de sujets |
// qui centre la miniature sur le sujet de l'image |
$image_redimensionnee = $this->opticrop($infos_image_originale, $format); |
} else { |
// si l'on ne dispose que de gd |
} |
if ($image_redimensionnee === false) { |
// si l'on ne dispose que de gd ou bien que Imagick a échoué |
// la minature est une image redimensionnée rognée au centre |
$image_redimensionnee = $this->creerMiniatureCarreeRognee($infos_image_originale, $format); |
} |
258,7 → 260,7 |
|
if ($this->estPaysage($informations_image)) { |
$cote_carre_non_redimensionne = $informations_image['hauteur']; |
$debut_largeur_a_copier = ($informations_image['hauteur'] - $cote_carre)/2 ; |
$debut_largeur_a_copier = ($informations_image['largeur'] / 2) - ($informations_image['hauteur'] / 2); |
$debut_hauteur_a_copier = 0; |
|
if($debut_largeur_a_copier <= 0) { |
270,7 → 272,7 |
} else { |
$cote_carre_non_redimensionne = $informations_image['largeur']; |
$debut_largeur_a_copier = 0 ; |
$debut_hauteur_a_copier = ($informations_image['largeur'] - $cote_carre)/2; |
$debut_hauteur_a_copier = ($informations_image['hauteur'] / 2) - ($informations_image['largeur'] / 2); |
|
if($debut_hauteur_a_copier <= 0) { |
$debut_hauteur_a_copier = 0; |
546,6 → 548,7 |
*/ |
public function opticrop($informations_image, $format) { |
umask(0); |
$erreur_ecriture = false; |
|
$nom_temp = md5(time()); |
$chemin_temp = |
581,109 → 584,129 |
$img->edgeImage($r); |
$img->modulateImage(100,0,100); // grayscale |
$img->blackThresholdImage("#0f0f0f"); |
$img->writeImage($out); |
$retour_ecriture_img = $img->writeImage($out); |
|
if ($retour_ecriture_img !== true) { |
error_log("Erreur d'écriture Imagick : [" . $chemin_image . "] vers [" . $out . "]"); |
$erreur_ecriture = true; |
} |
// use gd for random pixel access |
$im = ImageCreateFromJpeg($out); |
$xcenter = 0; |
$ycenter = 0; |
$sum = 0; |
$n = 100000; |
for ($k=0; $k<$n; $k++) { |
$i = mt_rand(0,$largeur_image_originale-1); |
$j = mt_rand(0,$hauteur_image_originale-1); |
$val = imagecolorat($im, $i, $j) & 0xFF; |
$sum += $val; |
$xcenter += ($i+1)*$val; |
$ycenter += ($j+1)*$val; |
|
if ($im === false) { |
error_log("GD ne peut pas lire l'image créée par Imagick : [" . $chemin_image . "] vers [" . $out . "]"); |
$erreur_ecriture = true; |
} |
$xcenter /= $sum; |
$ycenter /= $sum; |
|
if (! $erreur_ecriture) { |
$xcenter = 0; |
$ycenter = 0; |
$sum = 0; |
$n = 100000; |
for ($k=0; $k<$n; $k++) { |
$i = mt_rand(0,$largeur_image_originale-1); |
$j = mt_rand(0,$hauteur_image_originale-1); |
$val = imagecolorat($im, $i, $j) & 0xFF; |
$sum += $val; |
$xcenter += ($i+1)*$val; |
$ycenter += ($j+1)*$val; |
} |
$xcenter /= $sum; |
$ycenter /= $sum; |
|
// crop source img to target AR |
if ($largeur_image_originale/$hauteur_image_originale > $ar) { |
// source AR wider than target |
// crop width to target AR |
$wcrop0 = round($ar*$hauteur_image_originale); |
$hcrop0 = $hauteur_image_originale; |
} else { |
// crop height to target AR |
$wcrop0 = $largeur_image_originale; |
$hcrop0 = round($largeur_image_originale/$ar); |
} |
|
// crop parameters for all scales and translations |
$params = array(); |
|
// crop at different scales |
$hgap = $hcrop0 - $hauteur_vignette; |
$hinc = ($nk == 1) ? 0 : $hgap / ($nk - 1); |
$wgap = $wcrop0 - $largeur_vignette; |
$winc = ($nk == 1) ? 0 : $wgap / ($nk - 1); |
|
// find window with highest normalized edginess |
$n = 10000; |
$maxbetanorm = 0; |
$maxfile = ''; |
$maxparam = array('w'=>0, 'h'=>0, 'x'=>0, 'y'=>0); |
|
for ($k = 0; $k < $nk; $k++) { |
$hcrop = round($hcrop0 - $k*$hinc); |
$wcrop = round($wcrop0 - $k*$winc); |
$xcrop = $xcenter - $wcrop / 2; |
$ycrop = $ycenter - $hcrop / 2; |
//echo("crop: $wcrop, $hcrop, $xcrop, $ycrop"); |
|
if ($xcrop < 0) $xcrop = 0; |
if ($xcrop+$wcrop > $largeur_image_originale) $xcrop = $largeur_image_originale-$wcrop; |
if ($ycrop < 0) $ycrop = 0; |
if ($ycrop+$hcrop > $hauteur_image_originale) $ycrop = $hauteur_image_originale-$hcrop; |
|
/*if (self::MODE_DEBUG) { |
// debug |
$currfile = '/home/aurelien/web/file_tmp/'."image$k.jpg"; |
|
$currimg = clone $img; |
$c= new ImagickDraw(); |
$c->setFillColor("red"); |
$c->circle($xcenter, $ycenter, $xcenter, $ycenter+4); |
$currimg->drawImage($c); |
$currimg->cropImage($wcrop, $hcrop, $xcrop, $ycrop); |
$currimg->writeImage($currfile); |
$currimg->destroy(); |
}*/ |
|
$beta = 0; |
for ($c=0; $c<$n; $c++) { |
$i = mt_rand(0,$wcrop-1); |
$j = mt_rand(0,$hcrop-1); |
$beta += imagecolorat($im, $xcrop+$i, $ycrop+$j) & 0xFF; |
} |
$area = $wcrop * $hcrop; |
$betanorm = $beta / ($n*pow($area, $gamma-1)); |
// echo("beta: $beta; betan: $betanorm"); |
// echo("image$k.jpg:<br/>\n<img src=\"$currfile\"/>"); |
// best image found, save it |
|
if ($betanorm > $maxbetanorm) { |
|
$maxbetanorm = $betanorm; |
$maxparam['w'] = $wcrop; |
$maxparam['h'] = $hcrop; |
$maxparam['x'] = $xcrop; |
$maxparam['y'] = $ycrop; |
// $maxfile = $currfile; |
} |
} |
|
// écrasement de l'image par la version "croppée" |
$imgcp->cropImage($maxparam['w'], $maxparam['h'], $maxparam['x'], $maxparam['y']); |
$imgcp->scaleImage($largeur_vignette, $hauteur_vignette); |
$imgcp->writeImage($out); |
|
// crop source img to target AR |
if ($largeur_image_originale/$hauteur_image_originale > $ar) { |
// source AR wider than target |
// crop width to target AR |
$wcrop0 = round($ar*$hauteur_image_originale); |
$hcrop0 = $hauteur_image_originale; |
// return image |
chmod($out, 0777); |
$img->destroy(); |
$imgcp->destroy(); |
$image_sortie = ImageCreateFromJpeg($out); |
} else { |
// crop height to target AR |
$wcrop0 = $largeur_image_originale; |
$hcrop0 = round($largeur_image_originale/$ar); |
// image n'a pas pu être croppée - on retourne l'originale |
//$image_sortie = ImageCreateFromJpeg($chemin_image); |
$image_sortie = false; |
} |
|
// crop parameters for all scales and translations |
$params = array(); |
|
// crop at different scales |
$hgap = $hcrop0 - $hauteur_vignette; |
$hinc = ($nk == 1) ? 0 : $hgap / ($nk - 1); |
$wgap = $wcrop0 - $largeur_vignette; |
$winc = ($nk == 1) ? 0 : $wgap / ($nk - 1); |
|
// find window with highest normalized edginess |
$n = 10000; |
$maxbetanorm = 0; |
$maxfile = ''; |
$maxparam = array('w'=>0, 'h'=>0, 'x'=>0, 'y'=>0); |
|
for ($k = 0; $k < $nk; $k++) { |
$hcrop = round($hcrop0 - $k*$hinc); |
$wcrop = round($wcrop0 - $k*$winc); |
$xcrop = $xcenter - $wcrop / 2; |
$ycrop = $ycenter - $hcrop / 2; |
//echo("crop: $wcrop, $hcrop, $xcrop, $ycrop"); |
|
if ($xcrop < 0) $xcrop = 0; |
if ($xcrop+$wcrop > $largeur_image_originale) $xcrop = $largeur_image_originale-$wcrop; |
if ($ycrop < 0) $ycrop = 0; |
if ($ycrop+$hcrop > $hauteur_image_originale) $ycrop = $hauteur_image_originale-$hcrop; |
|
/*if (self::MODE_DEBUG) { |
// debug |
$currfile = '/home/aurelien/web/file_tmp/'."image$k.jpg"; |
|
$currimg = clone $img; |
$c= new ImagickDraw(); |
$c->setFillColor("red"); |
$c->circle($xcenter, $ycenter, $xcenter, $ycenter+4); |
$currimg->drawImage($c); |
$currimg->cropImage($wcrop, $hcrop, $xcrop, $ycrop); |
$currimg->writeImage($currfile); |
$currimg->destroy(); |
}*/ |
|
$beta = 0; |
for ($c=0; $c<$n; $c++) { |
$i = mt_rand(0,$wcrop-1); |
$j = mt_rand(0,$hcrop-1); |
$beta += imagecolorat($im, $xcrop+$i, $ycrop+$j) & 0xFF; |
} |
$area = $wcrop * $hcrop; |
$betanorm = $beta / ($n*pow($area, $gamma-1)); |
// echo("beta: $beta; betan: $betanorm"); |
// echo("image$k.jpg:<br/>\n<img src=\"$currfile\"/>"); |
// best image found, save it |
|
if ($betanorm > $maxbetanorm) { |
|
$maxbetanorm = $betanorm; |
$maxparam['w'] = $wcrop; |
$maxparam['h'] = $hcrop; |
$maxparam['x'] = $xcrop; |
$maxparam['y'] = $ycrop; |
// $maxfile = $currfile; |
} |
} |
|
// return image |
$imgcp->cropImage($maxparam['w'], $maxparam['h'], $maxparam['x'], $maxparam['y']); |
$imgcp->scaleImage($largeur_vignette, $hauteur_vignette); |
$imgcp->writeImage($out); |
chmod($out, 0777); |
$img->destroy(); |
$imgcp->destroy(); |
|
$image_sortie = ImageCreateFromJpeg($out); |
// destruction fichier temporaire dans tous les cas |
unlink($out); |
|
return $image_sortie; |