2012-09-20 11 views
14

Estoy creando miniaturas para un administrador de activos digitales, ¿cuál es la mejor manera de hacerlo con imagemagick?Convierta .psd y .ai a PNG/JPG con imagick

¿hay buenos recursos por ahí?

+0

ImageMagick línea de comandos tiene 'convert'. intente 'convertir orig.psd output.jpg' y vea si incluso lo hará; si lo hace, entonces puede comenzar a jugar con las opciones de cambio de tamaño. Si no es así, no perderás el tiempo ladrando en el árbol equivocado. –

+0

¿Hay alguna manera de que pueda hacer algo de línea de comando desde php (imagick)? –

+0

Eso es para que pueda probar la conversión y ver si incluso funciona. Un comando simple v.s. unas horas tratando de golpear un script php para hacer lo mismo. –

Respuesta

17

Lo resolví y lo compartiré con el MUNDO! convertirá .ai, .psd, .jpg, .png, .gif en miniaturas.

Aquí es una función que toma 4 params:

$ dir - directorio para salvar a.
$ tmpName - el nombre para nombrar el archivo excluyendo la extensión.
$ fileType - auto explicativo.
$ tamaño - Grande o pequeño.

function thumbGenerator($dir,$tmpName,$fileType,$size){ 
    $saveFileType = "png"; 
    $imagePath = $dir.$tmpName.".".$fileType; 
    $image = new Imagick(); 
    $image->readimage($imagePath); 
    if($fileType == "psd"){ 
     $image->setIteratorIndex(0); 
    } 
    $dimensions = $image->getImageGeometry(); 
    $width = $dimensions['width']; 
    $height = $dimensions['height']; 
    if($size == "large"){ 
     $maxWidth = 720; 
     $maxHeight =720; 
    } 
    if($size == "small"){ 
     $maxWidth = 250; 
     $maxHeight =250; 
    } 
    if($height > $width){ 
     //Portrait 
     if($height > $maxHeight) 
      $image->thumbnailImage(0, $maxHeight); 
      $dimensions = $image->getImageGeometry(); 
      if($dimensions['width'] > $maxWidth){ 
       $image->thumbnailImage($maxWidth, 0); 
      } 
    }elseif($height < $width){ 
     //Landscape 
     $image->thumbnailImage($maxWidth, 0); 
    }else{ 
     //square 
     $image->thumbnailImage($maxWidth, 0); 
    } 
    if($size == "large"){ 
     $image->writeImage($dir . $tmpName."-lg.".$saveFileType); 
    } 
    if($size == "small"){ 
     $image->writeImage($dir . $tmpName."-sm.".$saveFileType);; 
    } 
} 
+1

si funciona entonces acepta tu respuesta. ¡Aclamaciones! –

4

@Jason - Gracias por compartir. Aquí hay algunos consejos para un código más limpio y fácil de mantener/extender. Nuevamente, mucho depende de tus requisitos. Además, en realidad no ejecuté este código, así que perdona cualquier error tipográfico.

$ dir - directorio para guardarlo.
$ tmpName - el nombre para nombrar el archivo excluyendo la extensión.
$ fileType - auto explicativo.
$ tamaño - Grande o pequeño. Puede considerar tomar un valor de ancho de píxel para la miniatura en lugar de una cadena para un ancho predefinido. Supongamos que necesitará una miniatura más grande en una sección nueva de su página en el futuro (es decir, iconos listos para la retina con 500 píxeles para miniaturas "pequeñas"). Debe definir el tamaño de preferencia en la parte nueva del código en lugar de en la función thumbGenerator compartida

function thumbGenerator($dir,$tmpName,$fileType,$size){ 
    $saveFileType = "png"; 
    $imagePath = $dir.$tmpName.".".$fileType; 
    $image = new Imagick(); 
    $image->readimage($imagePath); 
    if($fileType == "psd"){ 
     $image->setIteratorIndex(0); 
    } 
/* Simplify this code section below 
    $dimensions = $image->getImageGeometry(); 
    $width = $dimensions['width']; 
    $height = $dimensions['height']; 
*/  
    list($width,$height) = $image->getImageGeometry(); // <--- new code 
/* Use $size for the pixel width/height instead and remove the code below 
    if($size == "large"){ 
     $maxWidth = 720; 
     $maxHeight =720; 
    } 
    if($size == "small"){ 
     $maxWidth = 250; 
     $maxHeight =250; 
    } 
*/ 
    if($height > $width){ 
     //Portrait 
     if($height > $size) 
      $image->thumbnailImage(0, $size); 
      $dimensions = $image->getImageGeometry(); 
      if($width > $size){ // <--- use the previously created $width variable 
       $image->thumbnailImage($size, 0); 
      } 
/* Don't need this duplicate code. 

    }elseif($height < $width){ 
     //Landscape 
     $image->thumbnailImage($maxWidth, 0); 
*/ 
    }else{ 
     // square or landscape 
     $image->thumbnailImage($maxWidth, 0); 
    } 
/* DRY - do not repeat yourself - Simplify it and use the pixel width in the image name 
    if($size == "large"){ 
     $image->writeImage($dir . $tmpName."-lg.".$saveFileType); 
    } 
    if($size == "small"){ 
     $image->writeImage($dir . $tmpName."-sm.".$saveFileType);; 
    } 
*/ 
$image->writeImage($dir . $tmpName."-".$size.".".$saveFileType);; 
} 
+0

Gracias, por los comentarios. Es increíble lo rápido que puede aprender algo, volver en un mes y nunca lo haría de esa manera otra vez. Algunas de estas características que usted comentó como repetición son realmente necesarias ya que son específicas de la aplicación. Aprecio la crítica. ¡Gracias! –

+0

¿De verdad ha probado este código? No funciona para mí, específicamente la parte 'list ($ width, $ height) = $ image-> getImageGeometry()'. ya que el resultado no es una matriz de tamaño 2, sino una 'matriz asociativa ('ancho' => 23, 'altura' => 42)' –