function valeurs_image_trans($img, $effet, $forcer_format = false) { include_spip('inc/filtres_images_lib_mini'); return _image_valeurs_trans($img, $effet, $forcer_format = false); }
/** * Réduit une image * * @uses extraire_attribut() * @uses inserer_attribut() * @uses _image_valeurs_trans() * @uses _image_ratio() * @uses _image_tag_changer_taille() * @uses _image_ecrire_tag() * @uses _image_creer_vignette() * * @param array $fonction * Un tableau à 2 éléments : * 1) string : indique le nom du filtre de traitement demandé (par exemple : `image_reduire`) ; * 2) array : tableau reprenant la valeur de `$img` et chacun des arguments passés au filtre utilisé. * @param string $img * Chemin de l'image ou texte contenant une balise img * @param int $taille * Largeur désirée * @param int $taille_y * Hauteur désirée * @param bool $force * @param bool $cherche_image * Inutilisé * @param string $process * Librairie graphique à utiliser (gd1, gd2, netpbm, convert, imagick). * AUTO utilise la librairie sélectionnée dans la configuration. * @return string * Code HTML de la balise img produite **/ function process_image_reduire($fonction, $img, $taille, $taille_y, $force, $cherche_image, $process = 'AUTO') { $image = false; if ($process == 'AUTO' and isset($GLOBALS['meta']['image_process'])) { $process = $GLOBALS['meta']['image_process']; } # determiner le format de sortie $format_sortie = false; // le choix par defaut sera bon if ($process == "netpbm") { $format_sortie = "jpg"; } elseif ($process == 'gd1' or $process == 'gd2') { $image = _image_valeurs_trans($img, "reduire-{$taille}-{$taille_y}", $format_sortie, $fonction); // on verifie que l'extension choisie est bonne (en principe oui) $gd_formats = explode(',', $GLOBALS['meta']["gd_formats"]); if (is_array($image) and (!in_array($image['format_dest'], $gd_formats) or $image['format_dest'] == 'gif' and !function_exists('ImageGif'))) { if ($image['format_source'] == 'jpg') { $formats_sortie = array('jpg', 'png', 'gif'); } else { $formats_sortie = array('png', 'jpg', 'gif'); } // Choisir le format destination // - on sauve de preference en JPEG (meilleure compression) // - pour le GIF : les GD recentes peuvent le lire mais pas l'ecrire # bug : gd_formats contient la liste des fichiers qu'on sait *lire*, # pas *ecrire* $format_sortie = ""; foreach ($formats_sortie as $fmt) { if (in_array($fmt, $gd_formats)) { if ($fmt != "gif" or function_exists('ImageGif')) { $format_sortie = $fmt; } break; } } $image = false; } } if (!is_array($image)) { $image = _image_valeurs_trans($img, "reduire-{$taille}-{$taille_y}", $format_sortie, $fonction); } if (!is_array($image) or !$image['largeur'] or !$image['hauteur']) { spip_log("image_reduire_src:pas de version locale de {$img}"); // on peut resizer en mode html si on dispose des elements if ($srcw = extraire_attribut($img, 'width') and $srch = extraire_attribut($img, 'height')) { list($w, $h) = _image_ratio($srcw, $srch, $taille, $taille_y); return _image_tag_changer_taille($img, $w, $h); } // la on n'a pas d'infos sur l'image source... on refile le truc a css // sous la forme style='max-width: NNpx;' return inserer_attribut($img, 'style', "max-width: {$taille}px; max-height: {$taille_y}px"); } // si l'image est plus petite que la cible retourner une copie cachee de l'image if ($image['largeur'] <= $taille && $image['hauteur'] <= $taille_y) { if ($image['creer']) { @copy($image['fichier'], $image['fichier_dest']); } return _image_ecrire_tag($image, array('src' => $image['fichier_dest'])); } if ($image['creer'] == false && !$force) { return _image_ecrire_tag($image, array('src' => $image['fichier_dest'], 'width' => $image['largeur_dest'], 'height' => $image['hauteur_dest'])); } if (in_array($image["format_source"], array('jpg', 'gif', 'png'))) { $destWidth = $image['largeur_dest']; $destHeight = $image['hauteur_dest']; $logo = $image['fichier']; $date = $image["date_src"]; $preview = _image_creer_vignette($image, $taille, $taille_y, $process, $force); if ($preview && $preview['fichier']) { $logo = $preview['fichier']; $destWidth = $preview['width']; $destHeight = $preview['height']; $date = $preview['date']; } // dans l'espace prive mettre un timestamp sur l'adresse // de l'image, de facon a tromper le cache du navigateur // quand on fait supprimer/reuploader un logo // (pas de filemtime si SAFE MODE) $date = test_espace_prive() ? '?' . $date : ''; return _image_ecrire_tag($image, array('src' => "{$logo}{$date}", 'width' => $destWidth, 'height' => $destHeight)); } else { return $img; } }
/** * Transforme la couleur de fond de l'image en transparence * Le filtre ne gere pas la notion de contiguite aux bords, et affectera tous les pixels de l'image dans la couleur visee * $background_color : couleur cible * $tolerance : distance L1 dans l'espace RGB des couleur autour de la couleur $background_color pour lequel la transparence sera appliquee * $alpha : transparence a appliquer pour les pixels de la couleur cibles avec la tolerance ci-dessus * $coeff_lissage : coeff applique a la tolerance pour determiner la decroissance de la transparence fonction de la distance L1 entre la couleur du pixel et la couleur cible * * @param string $im * @param string $background_color * @param int $tolerance * @param int $alpha * alpha = 0: aucune transparence * alpha = 127: completement transparent * @param int $coeff_lissage * @return mixed|null|string */ function image_fond_transparent($im, $background_color, $tolerance = 12, $alpha = 127, $coeff_lissage = 7) { $fonction = array('image_fond_transparent', func_get_args()); $image = _image_valeurs_trans($im, "fond_transparent-{$background_color}-{$tolerance}-{$coeff_lissage}-{$alpha}", "png", $fonction); if (!$image) { return ""; } $x_i = $image["largeur"]; $y_i = $image["hauteur"]; $im = $image["fichier"]; $dest = $image["fichier_dest"]; $creer = $image["creer"]; if ($creer) { $bg = _couleur_hex_to_dec($background_color); $bg_r = $bg['red']; $bg_g = $bg['green']; $bg_b = $bg['blue']; // Creation de l'image en deux temps // de facon a conserver les GIF transparents $im = $image["fonction_imagecreatefrom"]($im); imagepalettetotruecolor($im); $im2 = imagecreatetruecolor($x_i, $y_i); @imagealphablending($im2, false); @imagesavealpha($im2, true); $color_t = ImageColorAllocateAlpha($im2, 255, 255, 255, 127); imagefill($im2, 0, 0, $color_t); imagecopy($im2, $im, 0, 0, 0, 0, $x_i, $y_i); $im_ = imagecreatetruecolor($x_i, $y_i); imagealphablending($im_, false); imagesavealpha($im_, true); $color_f = ImageColorAllocateAlpha($im_, 255, 255, 255, $alpha); for ($x = 0; $x < $x_i; $x++) { for ($y = 0; $y < $y_i; $y++) { $rgb = ImageColorAt($im2, $x, $y); $r = $rgb >> 16 & 0xff; $g = $rgb >> 8 & 0xff; $b = $rgb & 0xff; if (($d = abs($r - $bg_r) + abs($g - $bg_g) + abs($b - $bg_b)) <= $tolerance) { imagesetpixel($im_, $x, $y, $color_f); } elseif ($tolerance and $d <= ($coeff_lissage + 1) * $tolerance) { $transp = round($alpha * (1 - ($d - $tolerance) / ($coeff_lissage * $tolerance))); $color_p = ImageColorAllocateAlpha($im_, $r, $g, $b, $transp); imagesetpixel($im_, $x, $y, $color_p); } else { imagesetpixel($im_, $x, $y, $rgb); } } } _image_gd_output($im_, $image); imagedestroy($im_); imagedestroy($im); imagedestroy($im2); } return _image_ecrire_tag($image, array('src' => $dest)); }
function action_tester_dist() { $arg = _request('arg'); $gd_formats = $gd_formats_read_gif = ""; // verifier les formats acceptes par GD if ($arg == "gd1") { // Si GD est installe et php >= 4.0.2 if (function_exists('imagetypes')) { if (imagetypes() & IMG_GIF) { $gd_formats[] = "gif"; } else { # Attention GD sait lire le gif mais pas forcement l'ecrire if (function_exists('ImageCreateFromGIF')) { $srcImage = @ImageCreateFromGIF(_ROOT_IMG_PACK . "test.gif"); if ($srcImage) { $gd_formats_read_gif = ",gif"; ImageDestroy($srcImage); } } } if (imagetypes() & IMG_JPG) { $gd_formats[] = "jpg"; } if (imagetypes() & IMG_PNG) { $gd_formats[] = "png"; } } else { # ancienne methode de detection des formats, qui en plus # est bugguee car elle teste les formats en lecture # alors que la valeur deduite sert a identifier # les formats disponibles en ecriture... (cf. inc_logos) $gd_formats = array(); if (function_exists('ImageCreateFromJPEG')) { $srcImage = @ImageCreateFromJPEG(_ROOT_IMG_PACK . "test.jpg"); if ($srcImage) { $gd_formats[] = "jpg"; ImageDestroy($srcImage); } } if (function_exists('ImageCreateFromGIF')) { $srcImage = @ImageCreateFromGIF(_ROOT_IMG_PACK . "test.gif"); if ($srcImage) { $gd_formats[] = "gif"; ImageDestroy($srcImage); } } if (function_exists('ImageCreateFromPNG')) { $srcImage = @ImageCreateFromPNG(_ROOT_IMG_PACK . "test.png"); if ($srcImage) { $gd_formats[] = "png"; ImageDestroy($srcImage); } } } if ($gd_formats) { $gd_formats = join(",", $gd_formats); } ecrire_meta("gd_formats_read", $gd_formats . $gd_formats_read_gif); ecrire_meta("gd_formats", $gd_formats); } else { if ($arg == "netpbm") { define('_PNMSCALE_COMMAND', 'pnmscale'); // chemin a changer dans mes_options if (_PNMSCALE_COMMAND == '') { return; } $netpbm_formats = array(); $jpegtopnm_command = str_replace("pnmscale", "jpegtopnm", _PNMSCALE_COMMAND); $pnmtojpeg_command = str_replace("pnmscale", "pnmtojpeg", _PNMSCALE_COMMAND); $vignette = _ROOT_IMG_PACK . "test.jpg"; $dest = _DIR_VAR . "test-jpg.jpg"; $commande = "{$jpegtopnm_command} {$vignette} | " . _PNMSCALE_COMMAND . " -width 10 | {$pnmtojpeg_command} > {$dest}"; spip_log($commande); exec($commande); if ($taille = @getimagesize($dest)) { if ($taille[1] == 10) { $netpbm_formats[] = "jpg"; } } $giftopnm_command = str_replace("pnmscale", "giftopnm", _PNMSCALE_COMMAND); $pnmtojpeg_command = str_replace("pnmscale", "pnmtojpeg", _PNMSCALE_COMMAND); $vignette = _ROOT_IMG_PACK . "test.gif"; $dest = _DIR_VAR . "test-gif.jpg"; $commande = "{$giftopnm_command} {$vignette} | " . _PNMSCALE_COMMAND . " -width 10 | {$pnmtojpeg_command} > {$dest}"; spip_log($commande); exec($commande); if ($taille = @getimagesize($dest)) { if ($taille[1] == 10) { $netpbm_formats[] = "gif"; } } $pngtopnm_command = str_replace("pnmscale", "pngtopnm", _PNMSCALE_COMMAND); $vignette = _ROOT_IMG_PACK . "test.png"; $dest = _DIR_VAR . "test-gif.jpg"; $commande = "{$pngtopnm_command} {$vignette} | " . _PNMSCALE_COMMAND . " -width 10 | {$pnmtojpeg_command} > {$dest}"; spip_log($commande); exec($commande); if ($taille = @getimagesize($dest)) { if ($taille[1] == 10) { $netpbm_formats[] = "png"; } } if ($netpbm_formats) { $netpbm_formats = join(",", $netpbm_formats); } else { $netpbm_formats = ''; } ecrire_meta("netpbm_formats", $netpbm_formats); } } // et maintenant envoyer la vignette de tests if (in_array($arg, array("gd1", "gd2", "imagick", "convert", "netpbm"))) { include_spip('inc/filtres'); include_spip('inc/filtres_images_mini'); $taille_preview = 150; $image = _image_valeurs_trans(_DIR_IMG_PACK . 'test_image.jpg', "reduire-{$taille_preview}-{$taille_preview}", 'jpg'); $image['fichier_dest'] = _DIR_VAR . "test_{$arg}"; if ($preview = _image_creer_vignette($image, $taille_preview, $taille_preview, $arg, true) and $preview['width'] * $preview['height'] > 0) { redirige_par_entete($preview['fichier']); } } # image echec redirige_par_entete(chemin_image('puce-rouge-anim.gif')); }
function _image_couleur_extraire($img, $x = 10, $y = 6) { static $couleur_extraite = array(); if (isset($couleur_extraite["{$img}-{$x}-{$y}"])) { return $couleur_extraite["{$img}-{$x}-{$y}"]; } // valeur par defaut si l'image ne peut etre lue $defaut = "F26C4E"; $cache = _image_valeurs_trans($img, "coul-{$x}-{$y}", "txt"); if (!$cache) { return $couleur_extraite["{$img}-{$x}-{$y}"] = $defaut; } $fichier = $cache["fichier"]; $dest = $cache["fichier_dest"]; if (isset($couleur_extraite["{$fichier}-{$x}-{$y}"])) { return $couleur_extraite["{$fichier}-{$x}-{$y}"]; } $creer = $cache["creer"]; if ($creer) { if (@file_exists($fichier)) { $width = $cache["largeur"]; $height = $cache["hauteur"]; $newwidth = 20; $newheight = 20; $thumb = imagecreate($newwidth, $newheight); $source = $cache["fonction_imagecreatefrom"]($fichier); imagepalettetotruecolor($source); imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); do { // get a color $color_index = imagecolorat($thumb, $x, $y); // make it human readable $color_tran = imagecolorsforindex($thumb, $color_index); $x++; $y++; } while ($color_tran['alpha'] == 127 and $x < $newwidth and $y < $newheight); $couleur = _couleur_dec_to_hex($color_tran["red"], $color_tran["green"], $color_tran["blue"]); } else { $couleur = $defaut; } // Mettre en cache le resultat $couleur_extraite["{$fichier}-{$x}-{$y}"] = $couleur; ecrire_fichier($dest, $couleur_extraite["{$fichier}-{$x}-{$y}"]); } else { lire_fichier($dest, $couleur_extraite["{$fichier}-{$x}-{$y}"]); } return $couleur_extraite["{$img}-{$x}-{$y}"] = $couleur_extraite["{$fichier}-{$x}-{$y}"]; }