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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 478 fois - Téléchargée 17 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

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

Bonne continuation,
GallyHC
Messages postés
386
Date d'inscription
samedi 4 octobre 2008
Statut
Membre
Dernière intervention
19 février 2018
2
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
Messages postés
6
Date d'inscription
dimanche 22 décembre 2002
Statut
Membre
Dernière intervention
29 août 2012

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
Messages postés
57
Date d'inscription
samedi 11 janvier 2003
Statut
Membre
Dernière intervention
30 janvier 2010

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.