File "image_positionner_par_focus.php"
Full path: /home/argothem/www/organecyberpresse/plugins/auto/centre_image/v4.0.0/inc/image_positionner_par_focus.php
File size: 2.46 KB
MIME-type: text/x-php
Charset: utf-8
<?php
/**
* Fonctions utiles au plugin Centre image
*
* @plugin Centre image
* @copyright 2015
* @author ARNO*
* @licence GNU/GPL
* @package SPIP\Centre_image\Fonctions
*/
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Retourne le positionnement à appliquer lors de la découpe d'une image
*
* @uses centre_image_x()
* @uses centre_image_y()
*
* @note
* Code repris de image_proportions du plugin Image Responsive
*
* @param string $img
* Chemin de l'image ou balise html `<img src=... />`.
* @param int $largeur
* Largeur finale de l'image
* @param int $hauteur
* Hauteur finale de l'image
* @param string $type
* type de centrage
* Avec "focus", point d'intérêt reste décentré
* Avec "focus-center", point d'intérêt aussi centré que possible
* @return string
* Positionnement tel qu'attendu par image_recadre, par exemple `top=50 left=12`
**/
function inc_image_positionner_par_focus_dist($img, $largeur, $hauteur, $type = "focus") {
if (!$img) {
return "";
}
if (!in_array($type, array("focus", "focus-center"))) {
return "";
}
// Taille d'origine de l'image
$l_img = largeur($img);
$h_img = hauteur($img);
// Si on a demandé à agrandir le recadrage, le focus ne veut pas dire grand chose,
// puisque l'image source entière est forcément incluse dans l'image finale
// on retombe donc sur le center par défaut dans ce cas
if ($largeur >= $l_img and $hauteur >= $h_img) {
return 'center';
}
if ($largeur == 0 OR $hauteur == 0) {
$largeur = $l_img;
$hauteur = $h_img;
}
if ($l_img == 0 OR $h_img == 0) {
return "";
}
$h_dest = round($hauteur);
$l_dest = round($largeur);
$res = centre_image($img);
$dx = $res['x'] ?? 0;
$dy = $res['y'] ?? 0;
$h_centre = $h_img * $dy;
$l_centre = $l_img * $dx;
if ($type == "focus-center") {
$top = round($h_centre - ($h_dest*0.5));
$left = round($l_centre - ($l_dest*0.5));
} else {
// ici on n'applique pas *$dy directement, car effet exagéré, alors on pondère
$top = round($h_centre - ($h_dest*((2*$dy+0.5)/3)));
$left = round($l_centre - ($l_dest*((2*$dx+0.5)/3)));
}
if ($top < 0) {
$top = 0;
}
if ($top + $h_dest > $h_img ) {
$top = $h_img - $h_dest;
}
if ($left < 0) {
$left = 0;
}
if ($left + $l_dest > $l_img ) {
$left = $l_img - $l_dest;
}
// echo "<li>$dx x $dy - $l_img x $h_img - $l_dest x $h_dest - $l_centre x $h_centre - $left x $top</li>";
$align = "top=$top, left=$left";
return $align;
}