2011-07-01 4 views
1

J'écris un script PHP en utilisant l'extension imagick. Ce que je veux que le script fasse est de prendre une image qu'un utilisateur télécharge et de créer une vignette de 200x128.PHP Imagick redimensionner avec un fond noir

Ce n'est pas la seule chose. Évidemment, toutes les images ne seront pas compatibles avec les proportions de 200x128. Donc, ce que je veux que le script fasse est de combler les lacunes avec un fond noir.

À l'heure actuelle, l'image est redimensionnée, mais il n'y a pas d'arrière-plan noir et la taille n'est pas correcte. Fondamentalement, l'image doit TOUJOURS être 200x128. L'image redimensionnée ira au centre, et le reste du contenu sera rempli de noir.

Des idées?

Voici mon code:

function portfolio_image_search_resize($image) { 

    // Check if imagick is loaded. If not, return false. 
    if(!extension_loaded('imagick')) { return false; } 

    // Set the dimensions of the search result thumbnail 
    $search_thumb_width = 200; 
    $search_thumb_height = 128; 

    // Instantiate class. Then, read the image. 
    $IM = new Imagick(); 
    $IM->readImage($image); 

    // Obtain image height and width 
    $image_height = $IM->getImageHeight(); 
    $image_width = $IM->getImageWidth(); 

    // Determine if the picture is portrait or landscape 
    $orientation = ($image_height > $image_width) ? 'portrait' : 'landscape'; 

    // Set compression and file type 
    $IM->setImageCompression(Imagick::COMPRESSION_JPEG); 
    $IM->setImageCompressionQuality(100); 
    $IM->setResolution(72,72); 
    $IM->setImageFormat('jpg'); 

    switch($orientation) { 

     case 'portrait': 

      // Since the image must maintain its aspect ratio, the rest of the image must appear as black 
      $IM->setImageBackgroundColor("black"); 

      $IM->scaleImage(0, $search_thumb_height); 

      $filename = 'user_search_thumbnail.jpg'; 

      // Write the image 
      if($IM->writeImage($filename) == true) { 
       return true; 
      } 
      else { 
       return false; 
      } 
      break; 

     case 'landscape': 

      // The aspect ratio of the image might not match the search result thumbnail (1.5625) 
      $IM->setImageBackgroundColor("black"); 

      $calc_image_rsz_height = ($image_height/$image_width) * $search_thumb_width; 

      if($calc_image_rsz_height > $search_thumb_height) { 
       $IM->scaleImage(0, $search_thumb_height); 
      } 
      else { 
       $IM->scaleImage($search_thumb_width, 0); 
      } 

      $filename = 'user_search_thumbnail.jpg'; 

      if($IM->writeImage($filename) == true) { 
       return true; 
      } 
      else { 
       return false; 
      } 

     break; 

    } 

} 
+0

Peut-être dessiner une image plus petite disons 128x128px au milieu d'une toile 200x128px? –

+0

Je ne sais pas grand-chose sur Imagick mais à cause de ma petite connaissance des graphismes, je pense que vous devriez juste créer un rectangle avec du remplissage noir et superposer votre vignette dessus. Cela ne devrait pas être difficile avec Imagick, n'est-ce pas? – afaolek

+1

PS: Essayez de mettre la ligne '$ IM-> setImageBackgroundColor (" noir ");' après les instructions de redimensionnement – afaolek

Répondre

0

exec('convert -define jpeg:size=400x436 big_image.jpg -auto-orient -thumbnail 200x218 -unsharp 0x.5 thumbnail.gif');

Vous devez installer ImageMagick.

sudo apt-get install imagemagick

Jetez un oeil à: http://www.imagemagick.org/Usage/thumbnails/#creation

Il montre d'autres exemples et comment étoffer la miniature avec une couleur d'arrière-plan de votre choix.

+0

Je crois que la question est spécifique à iMagick, le wrapper PHP pour imagemagick – kaese

2

Je sais que son vieux mais j'ai trouvé la réponse après une longue essayer:

vous devez utiliser thumbnailImage (http://php.net/manual/en/imagick.thumbnailimage.php)

à la fois bestfit $ et remplir $ comme vrai comme ceci:

$image->thumbnailImage(200, 128,true,true);