/** * html Pour pouvoir masquer les logos sans les downloader en petit ecran * il faut le mettre dans un conteneur parent que l'on masque * http://timkadlec.com/2012/04/media-query-asset-downloading-results/ * * On utilise un double conteneur : * le premier fixe la largeur, le second la hauteur par le ratio hauteur/largeur * grace a la technique des intrinsic-ratio ou padding-bottom-hack * http://mobile.smashingmagazine.com/2013/09/16/responsive-images-performance-problem-case-study/ * http://alistapart.com/article/creating-intrinsic-ratios-for-video * * Le span interieur porte l'image en background CSS * Le span conteneur ne porte pas de style display car trop prioritaire. * Sans CSS il occupe la largeur complete disponible, car en inline par defaut * Il suffit de lui mettre un float:xxx ou un display:block pour qu'il respecte la largeur initiale du logo * * Pour masquer les logos : * .spip_logos {display:none} * Pour forcer une taille maxi : * .spip_logos {max-width:25%;float:right} * * @param $logo * * @return string */ function responsive_logo($logo) { if (!function_exists('extraire_balise')) { include_spip('inc/filtres'); } if (!$logo or !($img = extraire_balise($logo, "img"))) { return $logo; } list($h, $w) = taille_image($img); $src = extraire_attribut($img, "src"); $class = extraire_attribut($img, "class"); // timestamper l'url si pas deja fait if (strpos($src, "?") == false) { $src = timestamp($src); } if (defined('_STATIC_IMAGES_DOMAIN')) { $src = url_absolue($src, _STATIC_IMAGES_DOMAIN); } $hover = ""; if ($hover_on = extraire_attribut($img, "onmouseover")) { $hover_off = extraire_attribut($img, "onmouseout"); $hover_on = str_replace("this.src=", "jQuery(this).css('background-image','url('+", $hover_on) . "+')')"; $hover_off = str_replace("this.src=", "jQuery(this).css('background-image','url('+", $hover_off) . "+')')"; $hover = " onmouseover=\"{$hover_on}\" onmouseout=\"{$hover_off}\""; } $ratio = round($h * 100 / $w, 2); return "<span class='{$class}' style=\"width:{$w}px;\"><span class=\"img\" style=\"display:block;position:relative;height:0;width:100%;padding-bottom:{$ratio}%;overflow:hidden;background:url({$src}) no-repeat center;background-size:100%;\"{$hover}> </span></span>"; }
/** * Tourner un document * * http://code.spip.net/@action_tourner_post * * @param int $id_document * @param int $angle * angle de rotation en degre>0 * @return */ function action_tourner_post($id_document, $angle) { $row = sql_fetsel("fichier,extension", "spip_documents", "id_document=" . intval($id_document)); if (!$row) { return; } include_spip('inc/charsets'); # pour le nom de fichier include_spip('inc/documents'); // Fichier destination : on essaie toujours de repartir de l'original $var_rot = $angle; $effacer = false; include_spip('inc/distant'); # pour copie_locale $src = _DIR_RACINE . copie_locale(get_spip_doc($row['fichier'])); if (preg_match(',^(.*)-r(90|180|270)\\.([^.]+)$,', $src, $match)) { $effacer = $src; $src = $match[1] . '.' . $match[3]; $var_rot += intval($match[2]); } $var_rot = (360 + $var_rot) % 360; // 0, 90, 180 ou 270 if ($var_rot > 0) { $dest = preg_replace(',\\.[^.]+$,', '-r' . $var_rot . '$0', $src); spip_log("rotation {$var_rot} {$src} : {$dest}"); include_spip('inc/filtres'); include_spip('public/parametrer'); // charger les fichiers fonctions #bugfix spip 2.1.0 $res = filtrer('image_rotation', $src, $var_rot); $res = filtrer('image_format', $res, $row['extension']); list($hauteur, $largeur) = taille_image($res); $res = extraire_attribut($res, 'src'); include_spip('inc/getdocument'); deplacer_fichier_upload($res, $dest); } else { $dest = $src; $size_image = @getimagesize($dest); $largeur = $size_image[0]; $hauteur = $size_image[1]; } // succes ! if ($largeur > 0 and $hauteur > 0) { $set = array('fichier' => set_spip_doc($dest), 'largeur' => $largeur, 'hauteur' => $hauteur, 'distant' => 'non'); if ($taille = @filesize($dest)) { $set['taille'] = $taille; } sql_updateq('spip_documents', $set, "id_document=" . intval($id_document)); if ($effacer) { spip_log("rotation : j'efface {$effacer}"); spip_unlink($effacer); } // pipeline pour les plugins pipeline('post_edition', array('args' => array('table' => 'spip_documents', 'table_objet' => 'documents', 'spip_table_objet' => 'spip_documents', 'type' => 'document', 'id_objet' => $id_document, 'champs' => array('rotation' => $angle, 'orientation' => $var_rot, 'fichier' => $row['fichier']), 'action' => 'tourner'), 'data' => $set)); } }
/** * une fonction pour generer une balise img a partir d'un nom de fichier * * @param string $img * @param string $alt * @param string $class * @return string */ function filtre_balise_img_dist($img,$alt="",$class=""){ $taille = taille_image($img); list($hauteur,$largeur) = $taille; if (!$hauteur OR !$largeur) return ""; return "<img src='$img' width='$largeur' height='$hauteur'" ." alt='".attribut_html($alt)."'" .($class?" class='".attribut_html($class)."'":'') .' />'; }
/** * produit une balise img avec un champ alt d'office si vide * attention le htmlentities et la traduction doivent etre appliques avant. * * http://doc.spip.org/@http_img_pack * * @param $img * @param $alt * @param string $atts * @param string $title * @param array $options * chemin_image : utiliser chemin_image sur $img fourni, ou non (oui par dafaut) * utiliser_suffixe_size : utiliser ou non le suffixe de taille dans le nom de fichier de l'image * sous forme -xx.png (pour les icones essentiellement) (oui par defaut) * @return string */ function http_img_pack($img, $alt, $atts = '', $title = '', $options = array()) { if (!isset($options['chemin_image']) or $options['chemin_image'] == true) { $img = chemin_image($img); } if (stripos($atts, 'width') === false) { // utiliser directement l'info de taille presente dans le nom if ((!isset($options['utiliser_suffixe_size']) or $options['utiliser_suffixe_size'] == true) and preg_match(',-([0-9]+)[.](png|gif)$,', $img, $regs)) { $largeur = $hauteur = intval($regs[1]); } else { $taille = taille_image($img); list($hauteur, $largeur) = $taille; if (!$hauteur or !$largeur) { return ""; } } $atts .= " width='" . $largeur . "' height='" . $hauteur . "'"; } return "<img src='{$img}' alt='" . attribut_html($alt ? $alt : $title) . "'" . ($title ? ' title="' . attribut_html($title) . '"' : '') . " " . ltrim($atts) . " />"; }
/** * Finalise le traitement GD * * Crée un fichier_image temporaire .src ou vérifie que le fichier_image * définitif a bien été créé. * * @uses statut_effacer_images_temporaires() * * @param ressource $img * Une ressource de type Image GD. * @param array $valeurs * Un tableau des informations (tailles, traitement, path...) accompagnant * l'image. * @param int $qualite * N'est utilisé que pour les images jpg. * Le niveau de qualité du fichier résultant : de 0 (pire qualité, petit * fichier) à 100 (meilleure qualité, gros fichier). Par défaut, prend la * valeur (85) de la constante _IMG_GD_QUALITE (modifiable depuis * mes_options.php). * @return bool * - true si le traitement GD s'est bien finalisé ; * - false sinon. */ function _image_gd_output($img, $valeurs, $qualite = _IMG_GD_QUALITE) { $fonction = "_image_image" . $valeurs['format_dest']; $ret = false; #un flag pour reperer les images gravees $lock = !statut_effacer_images_temporaires('get') or @file_exists($valeurs['fichier_dest']) and !@file_exists($valeurs['fichier_dest'] . '.src'); if (function_exists($fonction) && ($ret = $fonction($img, $valeurs['fichier_dest'], $qualite)) && isset($valeurs['reconstruction']) && !$lock) { if (@file_exists($valeurs['fichier_dest'])) { // dans tous les cas mettre a jour la taille de l'image finale list($valeurs["hauteur_dest"], $valeurs["largeur_dest"]) = taille_image($valeurs['fichier_dest']); $valeurs['date'] = @filemtime($valeurs['fichier_dest']); // pour la retrouver apres disparition ecrire_fichier($valeurs['fichier_dest'] . '.src', serialize($valeurs), true); } } return $ret; }
function image_imagick() { $tous = func_get_args(); $img = $tous[0]; $fonc = $tous[1]; $tous[0] = ""; $tous_var = join($tous, "-"); $fonction = array('image_imagick', func_get_args()); $image = _image_valeurs_trans($img, "{$tous_var}", "png", $fonction); if (!$image) { return ""; } $im = $image["fichier"]; $dest = $image["fichier_dest"]; $creer = $image["creer"]; if ($creer) { if (function_exists($fonc)) { $handle = imagick_readimage($im); $arr[0] = $handle; for ($i = 2; $i < count($tous); $i++) { $arr[] = $tous[$i]; } call_user_func_array($fonc, $arr); // Creer image dans fichier temporaire, puis renommer vers "bon" fichier // de facon a eviter time_out pendant creation de l'image definitive $tmp = preg_replace(",[.]png\$,i", "-tmp.png", $dest); imagick_writeimage($handle, $tmp); rename($tmp, $dest); ecrire_fichier($dest . ".src", serialize($image)); } } list($src_y, $src_x) = taille_image($dest); return _image_ecrire_tag($image, array('src' => $dest, 'width' => $src_x, 'height' => $src_y)); }
/** * Réduit les images d'un certain facteur * * @see image_reduire() * * @param string $img * Chemin de l'image ou texte * @param int $val * Facteur de réduction * @param bool $force * @return string * Code HTML de l'image ou du texte. **/ function image_reduire_par($img, $val = 1, $force = false) { list($hauteur, $largeur) = taille_image($img); $l = round($largeur / $val); $h = round($hauteur / $val); if ($l > $h) { $h = 0; } else { $l = 0; } $img = image_reduire($img, $l, $h, $force); return $img; }
function _image_gd_output($img,$valeurs, $qualite=_IMG_GD_QUALITE){ $fonction = "_image_image".$valeurs['format_dest']; $ret = false; #un flag pour reperer les images gravees $lock = !statut_effacer_images_temporaires('get') // si la fonction n'a pas ete activee, on grave tout OR (@file_exists($valeurs['fichier_dest']) AND !@file_exists($valeurs['fichier_dest'].'.src')); if ( function_exists($fonction) && ($ret = $fonction($img,$valeurs['fichier_dest'],$qualite)) # on a reussi a creer l'image && isset($valeurs['reconstruction']) # et on sait comment la resonctruire le cas echeant && !$lock ) if (@file_exists($valeurs['fichier_dest'])){ // dans tous les cas mettre a jour la taille de l'image finale list ($valeurs["hauteur_dest"],$valeurs["largeur_dest"]) = taille_image($valeurs['fichier_dest']); $valeurs['date'] = filemtime($valeurs['fichier_dest']); // pour la retrouver apres disparition ecrire_fichier($valeurs['fichier_dest'].'.src',serialize($valeurs),true); } return $ret; }