Skip to content
Extraits de code Groupes Projets
Valider bac7bf63 rédigé par cerdic's avatar cerdic Validation de marcimat
Parcourir les fichiers

fix: optimiser |image_nb en utilisant imagefilter(IMG_FILTER_GRAYSCALE) quand...

fix: optimiser |image_nb en utilisant imagefilter(IMG_FILTER_GRAYSCALE) quand aucune valeur de couleur n'est fournie
parent 07cba730
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!4720fix: optimiser |image_nb en utilisant imagefilter(IMG_FILTER_GRAYSCALE) quand...
......@@ -1082,21 +1082,31 @@ function image_masque($im, $masque, $pos = '') {
return _image_ecrire_tag($image, ['src' => $dest, 'width' => $x_dest, 'height' => $y_dest]);
}
// Passage de l'image en noir et blanc
// un noir & blanc "photo" n'est pas "neutre": les composantes de couleur sont
// ponderees pour obtenir le niveau de gris;
// on peut ici regler cette ponderation en "pour mille"
function image_nb($im, $val_r = 299, $val_g = 587, $val_b = 114) {
/**
* Passage de l'image en noir et blanc
* un noir & blanc "photo" n'est pas "neutre": les composantes de couleur sont
* ponderees pour obtenir le niveau de gris
* on peut ici regler cette ponderation en "pour mille"
*
* Par défaut, si on ne passe pas de pondération, on utilise le filtre IMG_FILTER_GRAYSCALE de GD beaucoup plus rapide
*
* @param string $im
* @param ?int $val_r
* @param ?int $val_g
* @param ?int $val_b
* @return string
*/
function image_nb($im, $val_r = null, $val_g = null, $val_b = null) {
$fonction = ['image_nb', func_get_args()];
$image = _image_valeurs_trans($im, "nb-$val_r-$val_g-$val_b", false, $fonction, false, _SVG_SUPPORTED);
$effet = 'nb-' . ($val_r ?? 'default') . '-' . ($val_g ?? 'default') . '-' . ($val_b ?? 'default');
$image = _image_valeurs_trans($im, $effet, false, $fonction, false, _SVG_SUPPORTED);
if (!$image) {
return '';
}
$x_i = $image['largeur'];
$y_i = $image['hauteur'];
$im = $image['fichier'];
$f = $image['fichier'];
$dest = $image['fichier_dest'];
$creer = $image['creer'];
......@@ -1107,44 +1117,62 @@ function image_nb($im, $val_r = 299, $val_g = 587, $val_b = 114) {
if ($creer) {
if ($image['format_source'] === 'svg') {
#$svg = svg_transformer($im, ['style' => "filter:grayscale(100%);"]); // ne semble pas fonctionner dans Safari+Chrome
$svg = svg_filter_grayscale($im, 1.0);
#$svg = svg_transformer($f, ['style' => "filter:grayscale(100%);"]); // ne semble pas fonctionner dans Safari+Chrome
$svg = svg_filter_grayscale($f, 1.0);
_image_gd_output($svg, $image);
} else {
// Creation de l'image en deux temps
// de facon a conserver les GIF transparents
$im = $image['fonction_imagecreatefrom']($im);
$im = $image['fonction_imagecreatefrom']($f);
imagepalettetotruecolor($im);
$im_ = imagecreatetruecolor($x_i, $y_i);
@imagealphablending($im_, false);
@imagesavealpha($im_, true);
$color_t = ImageColorAllocateAlpha($im_, 255, 255, 255, 127);
imagefill($im_, 0, 0, $color_t);
imagecopy($im_, $im, 0, 0, 0, 0, $x_i, $y_i);
if (is_null($val_r) && is_null($val_g) && is_null($val_b)) {
spip_log("image_nb: $f via imagefilter", 'images' . _LOG_DEBUG);
imagefilter($im, IMG_FILTER_GRAYSCALE);
_image_gd_output($im, $image);
imagedestroy($im);
}
else {
spip_log("image_nb: $f via calcul manuel", 'images' . _LOG_DEBUG);
// calcul à la main, beaucoup plus lent
$default = ['r' => 299, 'g' => 587, 'b' => 114];
$val_r = $val_r ?? $default['r'];
$val_g = $val_g ?? $default['g'];
$val_b = $val_b ?? $default['b'];
$x_i = $image['largeur'];
$y_i = $image['hauteur'];
$im_ = imagecreatetruecolor($x_i, $y_i);
@imagealphablending($im_, false);
@imagesavealpha($im_, true);
$color_t = ImageColorAllocateAlpha($im_, 255, 255, 255, 127);
imagefill($im_, 0, 0, $color_t);
imagecopy($im_, $im, 0, 0, 0, 0, $x_i, $y_i);
for ($x = 0; $x < $x_i; $x++) {
for ($y = 0; $y < $y_i; $y++) {
$rgb = ImageColorAt($im_, $x, $y);
$a = ($rgb >> 24) & 0xFF;
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
for ($x = 0; $x < $x_i; $x++) {
for ($y = 0; $y < $y_i; $y++) {
$rgb = ImageColorAt($im_, $x, $y);
$a = ($rgb >> 24) & 0xFF;
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$c = round(($val_r * $r / 1000) + ($val_g * $g / 1000) + ($val_b * $b / 1000));
if ($c < 0) {
$c = 0;
}
if ($c > 254) {
$c = 254;
}
$c = round(($val_r * $r / 1000) + ($val_g * $g / 1000) + ($val_b * $b / 1000));
if ($c < 0) {
$c = 0;
}
if ($c > 254) {
$c = 254;
}
$color = ImageColorAllocateAlpha($im_, $c, $c, $c, $a);
imagesetpixel($im_, $x, $y, $color);
$color = ImageColorAllocateAlpha($im_, $c, $c, $c, $a);
imagesetpixel($im_, $x, $y, $color);
}
}
_image_gd_output($im_, $image);
imagedestroy($im_);
imagedestroy($im);
}
_image_gd_output($im_, $image);
imagedestroy($im_);
imagedestroy($im);
}
}
......
  • cerdic @cerdic

    mentioned in commit ade1aea4

    ·

    mentioned in commit ade1aea4

    Afficher/masquer la liste des validations
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter