Proposer une amélioration de commentaire

Le commentaire à poster est au format «docblock» (de phpDoc) qui peut être enrichi de tags spécifiques pour SPIP.
Fichier
plugins-dist/filtres_images/filtres/images_transforme.php
Fonction
image_aplatir

    Nom ou pseudo de l'auteur de la proposition

Code original

// 1/ Aplatir une image semi-transparente (supprimer couche alpha)
// en remplissant la transparence avec couleur choisir $coul.
// 2/ Forcer le format de sauvegarde (jpg, png, gif)
// pour le format jpg, $qualite correspond au niveau de compression (defaut 85)
// pour le format gif, $qualite correspond au nombre de couleurs dans la palette (defaut 128)
// pour le format png, $qualite correspond au nombre de couleur dans la palette ou si 0 a une image truecolor (defaut truecolor)
// attention, seul 128 est supporte en l'etat (production d'images avec palette reduite pas satisfaisante)
// https://code.spip.net/@image_aplatir
// 3/ $transparence a "true" permet de conserver la transparence (utile pour conversion GIF)
// https://code.spip.net/@image_aplatir
function image_aplatir($im, $format = 'jpg', $coul = '000000', $qualite = null, $transparence = false) {
	if ($qualite === null) {
		if ($format == 'jpg') {
			$qualite = _IMG_GD_QUALITE;
		} elseif ($format == 'png') {
			$qualite = 0;
		} else {
			$qualite = 128;
		}
	}
	$fonction = array('image_aplatir', func_get_args());
	$image = _image_valeurs_trans($im, "aplatir-$format-$coul-$qualite-$transparence", $format, $fonction);
 
	if (!$image) {
		return ("");
	}
 
	include_spip('inc/filtres');
	$couleurs = _couleur_hex_to_dec($coul);
	$dr = $couleurs["red"];
	$dv = $couleurs["green"];
	$db = $couleurs["blue"];
 
	$x_i = $image["largeur"];
	$y_i = $image["hauteur"];
 
	$im = $image["fichier"];
	$dest = $image["fichier_dest"];
 
	$creer = $image["creer"];
 
	if ($creer) {
		$im = @$image["fonction_imagecreatefrom"]($im);
		imagepalettetotruecolor($im);
		$im_ = imagecreatetruecolor($x_i, $y_i);
		if ($image["format_source"] == "gif" and function_exists('ImageCopyResampled')) {
			// Si un GIF est transparent, 
			// fabriquer un PNG transparent  
			// Conserver la transparence 
			@imagealphablending($im_, false);
			@imagesavealpha($im_, true);
			if (function_exists("imageAntiAlias")) {
				imageAntiAlias($im_, true);
			}
			@ImageCopyResampled($im_, $im, 0, 0, 0, 0, $x_i, $y_i, $x_i, $y_i);
			imagedestroy($im);
			$im = $im_;
		}
 
		// allouer la couleur de fond
		if ($transparence) {
			@imagealphablending($im_, false);
			@imagesavealpha($im_, true);
			$color_t = imagecolorallocatealpha($im_, $dr, $dv, $db, 127);
		} else {
			$color_t = ImageColorAllocate($im_, $dr, $dv, $db);
		}
 
		imagefill($im_, 0, 0, $color_t);
 
		//??
		//$dist = abs($trait);
 
		$transp_x = false;
 
		if ($image["format_source"] == "jpg") {
			$im_ = &$im;
		} else {
			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;
 
					$a = (127 - $a) / 127;
 
					if ($a == 1) { // Limiter calculs
						$r = $r;
						$g = $g;
						$b = $b;
					} else {
						if ($a == 0) { // Limiter calculs
							$r = $dr;
							$g = $dv;
							$b = $db;
 
							$transp_x = $x; // Memoriser un point transparent
							$transp_y = $y;
 
						} else {
							$r = round($a * $r + $dr * (1 - $a));
							$g = round($a * $g + $dv * (1 - $a));
							$b = round($a * $b + $db * (1 - $a));
						}
					}
					$a = (1 - $a) * 127;
					$color = ImageColorAllocateAlpha($im_, $r, $g, $b, $a);
					imagesetpixel($im_, $x, $y, $color);
				}
			}
		}
		// passer en palette si besoin
		if ($format == 'gif' or ($format == 'png' and $qualite !== 0)) {
			// creer l'image finale a palette
			// (on recycle l'image initiale si possible, sinon on en recree une)
			if ($im === $im_) {
				$im = imagecreatetruecolor($x_i, $y_i);
			}
 
			@imagetruecolortopalette($im, true, $qualite);
 
 
			//$im = imagecreate($x_i, $y_i);
			// copier l'image true color vers la palette
			imagecopy($im, $im_, 0, 0, 0, 0, $x_i, $y_i);
			// matcher les couleurs au mieux par rapport a l'image initiale
			// si la fonction est disponible (php>=4.3)
			if (function_exists('imagecolormatch')) {
				@imagecolormatch($im_, $im);
			}
 
			if ($format == 'gif' && $transparence && $transp_x) {
				$color_t = ImagecolorAt($im, $transp_x, $transp_y);
				if ($format == "gif" && $transparence) {
					@imagecolortransparent($im, $color_t);
				}
			}
 
 
			// produire le resultat
			_image_gd_output($im, $image, $qualite);
		} else {
			_image_gd_output($im_, $image, $qualite);
		}
		if ($im !== $im_) {
			imagedestroy($im);
		}
		imagedestroy($im_);
	}
 
	return _image_ecrire_tag($image, array('src' => $dest));
}

Le commentaire au format « docblock » peut être complété des éléments suivants sécifiques
à SPIP.

Sur un entête de fichier :

  • @package SPIP\Core\x (pour un fichier du core, x dépendant du fichier)
  • @package SPIP\Nom\x (pour un fichier de plugin, Nom étant le nom du plugin)

Sur un entête de fonction :

  • @pipeline x : indique que la fonction est une utilisation d’un pipeline
  • @pipeline_appel x : indique que la fonction appelle le pipeline indiqué
  • @balise : indique que la fonction est une compilation de balise
  • @filtre : indique un |filtre
  • @critere : indique que la fonction est une compilaiton de critère
  • @boucle : indique que la fonction est une compilaiton de boucle
Vous inscrire sur ce site

L’espace privé de ce site est ouvert aux visiteurs, après inscription. Une fois enregistré, vous pourrez consulter les articles en cours de rédaction, proposer des articles et participer à tous les forums.

Identifiants personnels

Indiquez ici votre nom et votre adresse email. Votre identifiant personnel vous parviendra rapidement, par courrier électronique.