2013-08-19 20 views
11

Io uso imagick per il ritaglio di miniature, ma a volte le miniature ritagliate mancano la parte superiore delle immagini (capelli, occhi).come uso imagick in php? (ridimensiona e ritaglia)

Stavo pensando di ridimensionare l'immagine e ritagliarla. Inoltre, ho bisogno di mantenere il rapporto di dimensione dell'immagine.

riportano di seguito le script php che uso per il raccolto:

$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">'; 

Thanks ..

+0

Quali errori stai ottenendo? qual è l'uscita prevista? Quale versione di PHP? è installato imagick? Maggiori dettagli per favore ... –

+1

No, non si tratta di un errore. l'immaginazione funziona bene. Sopra lo script si ritaglia solo. Voglio ridimensionare prima, poi voglio ritagliarlo, quindi mi manca il primo passo .. – newworroo

+0

Bene, prima chiama 'imageResize', quindi ... –

risposta

22

Questo compito non è facile in quanto la parte "importante" non può essere sempre allo stesso posto. Ancora, utilizzando qualcosa di simile

$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">'; 

(testato)

dovrebbe funzionare. I parametri cropImage (0 e 0) determinano l'angolo superiore sinistro dell'area di ritaglio. Quindi giocare con questi ti dà risultati diversi su ciò che rimane nell'immagine.

+1

Grazie !!! È perfetto .. – newworroo

1

Sulla base di Martin's answer Ho fatto una funzione più generale che ridimensiona e le colture immagine Imagick per adattarsi larghezza e altezza (cioè si comporta esattamente come dichiarazione CSS background-size: cover):

/** 
* 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); 
} 

Spero che questo possa aiutare qualcuno.

+1

'' imagick :: FILTER_LANCZOS'' dovrebbe essere '' \ Imagick :: FILTER_LANCZOS'' –