2013-08-19 10 views
11

Ich benutze imagick für Thumbnail Crop, aber manchmal abgeschnittene Thumbnails fehlen oberen Teil der Bilder (Haare, Augen).Wie benutze ich Imagick in PHP? (Größe ändern & beschneiden)

Ich dachte daran, das Bild zu verkleinern und es dann zu schneiden. Außerdem muss ich das Bildgrößenverhältnis beibehalten.

Unten ist der PHP-Skript, das ich für den Pflanzenbau verwenden:

$im = new imagick("img/20130815233205-8.jpg"); 
$im->cropThumbnailImage(80, 80); 
$im->writeImage("thumb/th_80x80_test.jpg"); 
echo '<img src="thumb/th_80x80_test.jpg">'; 

Dank ..

+0

Welche Fehler erhalten Sie? Was ist die erwartete Ausgabe? Welche Version von PHP? ist imagick installiert? Weitere Details bitte ... –

+1

Nein, hier geht es nicht um einen Fehler. Imagick funktioniert gut. Das obige Skript schneidet nur. Ich möchte zuerst GRÖSSE, dann möchte ich es zuschneiden, so vermisse ich ersten Schritt .. – newworroo

+0

Nun, rufen Sie 'imageResize' zuerst, dann ... –

Antwort

22

Diese Aufgabe ist nicht einfach, da der „wichtige“ Teil nicht immer an der gleichen Stelle sein kann. Dennoch mit so etwas wie dieses

$im = new imagick("c:\\temp\\523764_169105429888246_1540489537_n.jpg"); 
$imageprops = $im->getImageGeometry(); 
$width = $imageprops['width']; 
$height = $imageprops['height']; 
if($width > $height){ 
    $newHeight = 80; 
    $newWidth = (80/$height) * $width; 
}else{ 
    $newWidth = 80; 
    $newHeight = (80/$width) * $height; 
} 
$im->resizeImage($newWidth,$newHeight, imagick::FILTER_LANCZOS, 0.9, true); 
$im->cropImage (80,80,0,0); 
$im->writeImage("D:\\xampp\\htdocs\\th_80x80_test.jpg"); 
echo '<img src="th_80x80_test.jpg">'; 

(getestet)

funktionieren sollte. Die cropImage-Parameter (0 und 0) bestimmen die obere linke Ecke des Zuschneidebereichs. Wenn Sie damit spielen, erhalten Sie unterschiedliche Ergebnisse dessen, was im Bild bleibt.

+1

Vielen Dank !!! Es ist perfekt .. – newworroo

1

Basierend auf Martin's answer machte ich eine allgemeinere Funktion, die die Größe und Kulturen Imagick Bild gegebene Breite und Höhe passen (d verhält sich genau wie CSS background-size: cover Erklärung):

/** 
* Resizes and crops $image to fit provided $width and $height. 
* 
* @param \Imagick $image 
* Image to change. 
* @param int $width 
* New desired width. 
* @param int $height 
* New desired height. 
*/ 
function image_cover(Imagick $image, $width, $height) { 
    $ratio = $width/$height; 

    // Original image dimensions. 
    $old_width = $image->getImageWidth(); 
    $old_height = $image->getImageHeight(); 
    $old_ratio = $old_width/$old_height; 

    // Determine new image dimensions to scale to. 
    // Also determine cropping coordinates. 
    if ($ratio > $old_ratio) { 
    $new_width = $width; 
    $new_height = $width/$old_width * $old_height; 
    $crop_x = 0; 
    $crop_y = intval(($new_height - $height)/2); 
    } 
    else { 
    $new_width = $height/$old_height * $old_width; 
    $new_height = $height; 
    $crop_x = intval(($new_width - $width)/2); 
    $crop_y = 0; 
    } 

    // Scale image to fit minimal of provided dimensions. 
    $image->resizeImage($new_width, $new_height, imagick::FILTER_LANCZOS, 0.9, true); 

    // Now crop image to exactly fit provided dimensions. 
    $image->cropImage($new_width, $new_height, $crop_x, $crop_y); 
} 

Hope this jemand helfen kann.

+1

'' imagick :: FILTER_LANCZOS'' sollte '' \ Imagick :: FILTER_LANCZOS'' sein –