Génération de miniatures iPhone à la volée

Par Maxime, le 23 décembre 2009.

Pour mes derniers articles j’ai eu besoin d’afficher des captures d’écran issues de mon iPhone. Mais comme je ne pouvais rien faire simplement, je n’allais tout de même pas ouvrir Photoshop pour créer des miniatures ! Rendons à la machine ce qui est à la machine.

Afin de créer vous aussi vos miniatures iPhone, vous aurez besoin de remplir les conditions suivantes :

  • Posséder un blog WordPress (sans déc’ ?)
  • Avoir la librairie PHP Imagick
  • Disposer d’un accès FTP sur votre blog

J’ai commencé par récupérer une image d’iPhone « vide », que j’ai réduite de moitié pour adapter à la taille de mon blog. Vous pouvez récupérer l’image en cliquant ci-dessous. Elle est à mettre dans le dossier /wp-vcon :

La technique que j’ai adoptée pour la génération d’images à la volée est de passer par un fichier .htaccess dans /wp-content/uploads. Il sert à rediriger toutes les requêtes vers des fichiers inexistants sur un script spécifique, en l’occurrence le script pour les miniatures :

Options -Indexes

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ /wp-content/uploads/check.php?route=$1 [L,QSA]

L’image à l’intérieur de l’iPhone est la moitié d’une capture d’écran faite via l’iPhone (en appuyant simultanément sur la touche Home et la touche Power).

<?php

$destination = $_GET['route'];

if (eregi("^(.+)-iphone\.(.+)$",$destination,$r)) {

	header("Content-type: image/".$r[2]);

	$original = $r[1].".".$r[2];

	if (file_exists($original)) {

		$or = new Imagick($original);
		$or->setCompression(Imagick::FILTER_LANCZOS);
		$or->ThumbnailImage(160,240,true);

		$im = new Imagick(dirname(__FILE__).'/iphone-gui.png');
		$im->compositeImage($or,Imagick::COMPOSITE_DEFAULT,18,60);

		$im->writeImage($destination);

		echo file_get_contents($destination);

	}

}

header("HTTP/1.0 404 Not Found"); 

?>

Exemple concret après installation du script : Si vous avez uploadé une image nommée application.png, il vous suffit de rajouter « -iphone » juste avant l’extension du fichier pour avoir un aperçu iPhone, ce qui donnera application-iphone.png.

Et voilà, grâce à ces quelques fichiers, ma flemme d’ouvrir Photoshop pour avoir de jolies miniatures est entièrement comblée, j’espère que ça pourra servir à quelques personnes. Le script est très facilement adaptable sur d’autres plate-formes que WordPress, j’ai donné cette intégration pour l’exemple.

13 commentaires

Yus

Rooh cte technique de feignasse, j’adore. :D

Saru —

Trop fort ce gay \o/
Je dirais même :
$destination = str_replace(array(‘\ »,’ »‘), array( », »), $_GET['route']);

Et aussi preg_match au lieu de eregi (viré en php6).
Mais ca c’est parceque j’aime bien quand c’est imbitable.

Bisous toussa

Joffrey

On ne prendra bien sûr pas en compte la possibilité d’ajouter autant de « -iphone » que l’on souhaite, et ainsi remplir le serveur de la… victime. MOUAHAHAH.

Mais comme t’es un enfoiré et que j’ai même pas le temps d’écrire mon commentaire, c’est déjà corrigé. M’en fous je le publie quand même.

Maxime

@Saru : oui, il faut que je m’y mette à ce bâtard de preg_match :)

Louis

Y’a pas moyen de rajouter une classe CSS dans le code d’affichage de l’image, qui mettrait par dessus l’image le contour de celle-ci (l’image de l’iphone avec le milieu transparent) ?

Ou bien en CSS toujours, d’entourer via quatre images (les contours l’iphone divisé en quatre) l’image ayant cette classe ?

Maxime

@Louis : Si, mais il faudrait donc redimensionner les captures à la main, puisque là elles sont à la moitié de leur taille d’origine.

Louis

@Maxime : Pas forcément, tu peux spécifier une largeur/hauteur max pour tes captures (après, il faut voir comment ce sera interprété par le navigateur), comme ça ton image à encadrer est toujours de la même taille.

Je me plais à me dire que cette solution est moins technique (donc plus honteuse), mais qu’elle a le mérite de soulager ton serveur du traitement que tu lui demandes à chaque image portant le « -iphone » à la fin.

Maxime

@Louis : Niveau bande passante c’est idiot du coup puisque le client va télécharger une image taille réelle, pour l’afficher à une taille réduite, sans compter la compression à la volée qui peut mal rendre, comparé au filtre Lanczos de Imagick.

Et concernant le serveur il n’est pas très sollicité pour une seule génération d’image, vu qu’après l’image est sur le disque :)

Arthur

Bonjour :) Merci bien pour ce script que je cherche depuis bien longtemps.. mais je suis perdu au niveau du deuxième code.. Où faut-il le mettre ? Je ne suis pas expert =/

Arthur

Je précise que je suis sur un hébergement 1and1 mutualisé.

DaviXX

Et oh ! preg_match() ne doit pas être insulté, tu n’as donc jamais utilisé Perl ?

Et si tu parle de serveur sollicité, conseil, prends l’habitude d’utiliser des apostrophes plutôt que des guillemets :)

en tout cas, sympa ton blog… (il faut dire « ton site ? »)

Maxime

@Arthur : Dans wp-content/uploads

@DaviXX : C’était de l’humour :) et pour les apostrophes c’est assez controversé, mon avis c’est de faire un peu comme je veux, même si souvent j’utilise des apostrophes, des guillemets quand j’ai besoin d’échapper des caractères. Sinon tu peux dire mon blog, j’assume.

Berrehili

Excellent article !
Très bien décrit, vraiment un tuto complet… On en trouve rarement concernant le memcached !

Laisser un commentaire

Note : Pour qu'un commentaire soit affiché, votre e-mail doit être valide, et votre texte ne doit pas comporter d'insultes. Si vous ne respectez pas ça, n'essayez même pas de commenter.