Extraire la miniature d'un fichier .ai (adobe illustrator)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 134 fois - Téléchargée 19 fois

Contenu du snippet

Petit code source pour extraire la miniature (aussi appellée "thumbnail" ou "preview") contenue à l'intérieur même des fichiers au format Adobe Illustrator (.AI).
Pour info, la miniature fait toujours 128 pixels de largeur ou de hauteur maximum, et est en 256 couleurs.
Le script consiste en une fonction PHP qui recoit comme argument le chemin d'accès au fichier AI, et renvoie une image GD, que l'on peut ensuite sortir en JPG, PNG ou autre.

Merci de ne pas utiliser cette source dans un projet commercial sans mon accord préalable (non-concurrence avec mon propre projet).

Vous pourrez retrouver cette source sur mon site :
http://www.devkb.org/php/46-Extraire-la-miniature-d-un-fichier-AI-Adobe-Illustrator-en-PHP

Et pour d'autres sources du même type, rendez vous sur http://www.devkb.org/ !

Bon codage, et PHP powaaaa ;-)
Olivier Ligny

Source / Exemple :


<?php

function Extract_AI_thumbnail($AIfile) {
	
	// Extract thumbnails from .AI files
	// input : path to file
	// output : GD image
	// author : Olivier Ligny, antares7364 'at' yahoo.fr, 2007-09-20
	// thanks to : http://groups.google.com/group/adobe.illustrator.windows/browse_thread/thread/715cc9efe657f280/0a9d7b1244b59062?hl=en&lnk=st&q=AI7_Thumbnail+%22hex+bytes%22&rnum=1

	$f = fopen($AIfile, 'rb');
	$data = fread($f, 100000);
	fclose($f);

	$start = strpos($data, '%AI7_Thumbnail:');
	$end   = strpos($data, '%%EndData');
	if(!$start || !$end) return false;
	//echo "TN: from $start to $end\r\n";
	//die(substr($data, $start, $end-$start));
	$tnData = substr($data, $start, $end-$start);
	//die(substr($tnData, 0, 10));
	$header = substr($tnData, strpos($tnData,':')+1, 100);
	$header = substr($header, 0, strpos($header,"\r"));
	//die(str_replace("\r", "\r\n", $header));
	$imageSize = explode(' ', trim($header));
	//echo "Image size : ".$imageSize[0].' * '.$imageSize[1]."\r\n"; //exit;
	if($imageSize[0] * $imageSize[1] == 0) return false; //die("Error: invalid thumbnail header : $header\r\n");
	$imgData = substr($tnData, strpos($tnData,'Hex Bytes')+strlen('Hex Bytes'), strlen($tnData));
	$imgData = trim($imgData);
	$imgData = str_replace("\r", "", $imgData);
	$imgData = str_replace("\n", "", $imgData);
	$imgData = str_replace("%", "", $imgData);
	$imgData = str_replace("", "", $imgData);
	$len = strlen($imgData);
	$binData = pack("H" . $len, $imgData);
	$arr = Array();
	for($i=0; $i<strlen($binData); $i++) $arr[$i] = ord($binData[$i]);
	$byteArray = $arr;
	$gdimg = imagecreatetruecolor($imageSize[0], $imageSize[1]);
	$colors = Array();
	for($c=0; $c<256*3; $c+=3) {
		$colors[] = imagecolorallocate($gdimg, $byteArray[$c+0], $byteArray[$c+1], $byteArray[$c+2]);
	}
	$refs = Array();
	if($binData[256*3+0].$binData[256*3+1].$binData[256*3+2]=='RLE') {
		for($c=256*3; $c<count($byteArray); $c++) {
			$b = $byteArray[$c];
			if($b != 0xFD) $refs[] = $b;
			else {
				$c++;
				$b = $byteArray[$c];
				if($b == 0xFD) $refs[] = $b;
				else {
					$n = $b;
					$c++;
					$b = $byteArray[$c];
					for($i=0; $i<$n; $i++) $refs[] = $b;
				}
			}
		}
	} else {
		for($c=256*3; $c<count($byteArray); $c++) {
			$refs[] = $byteArray[$c];
		}
	}
	for($y=0; $y<$imageSize[1]; $y++) {
		for($x=0; $x<$imageSize[0]; $x++) {
			$n = $refs[$y*$imageSize[0] + $x];
			@imagesetpixel($gdimg, $x, $y, $colors[$n]);
		}
	}
	return $gdimg;
}

$img = Extract_AI_thumbnail('fichier.ai');
imagejpeg($img, 'fichier.jpg', 85);

?>

A voir également

Ajouter un commentaire Commentaires
gallyhc Messages postés 386 Date d'inscription samedi 4 octobre 2008 Statut Membre Dernière intervention 19 février 2018 2
22 mars 2008 à 15:45
au dernier moment j'ai preferais mettre la note de 9/10. Pour l'idée en plus.

Bonne continuation,
GallyHC
gallyhc Messages postés 386 Date d'inscription samedi 4 octobre 2008 Statut Membre Dernière intervention 19 février 2018 2
22 mars 2008 à 15:44
Bonjour,

Je ne sais pas pourquoi mais j'ai un decallage en x et y de quelque pixels et je me demande si vous aviez vu le problemes.

La sources et vraiment pas mal je met perso 8/10

Bonne contination,
GallyHC
antares7364 Messages postés 6 Date d'inscription dimanche 22 décembre 2002 Statut Membre Dernière intervention 29 août 2012
26 sept. 2007 à 18:27
Non ça ne marche qu'avec les .AI, désolé.
Par contre pour les PSD tu peux essayer la bibliothèque Java Imagero : http://reader.imagero.com
D1stort1on Messages postés 57 Date d'inscription samedi 11 janvier 2003 Statut Membre Dernière intervention 30 janvier 2010
25 sept. 2007 à 12:19
Salut, sympa ce code.

Mais j'ai une petite question, est-ce que ça peut fonctionner avec un fichier photoshop ? .psd ?

Merci

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.