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

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

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.