예제 #1
0
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));
}
예제 #4
0
파일: tester.php 프로젝트: nursit/SPIP
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'));
}
예제 #5
0
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}"];
}