Exemplo n.º 1
0
function image_ratio($srcWidth, $srcHeight, $maxWidth, $maxHeight)
{
    include_spip('inc/filtres_images_lib');
    return _image_ratio($srcWidth, $srcHeight, $maxWidth, $maxHeight);
}
/**
 * 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;
    }
}