2013-08-19 14 views
11

Używam imagik do przycinania miniaturek, ale czasami przycięte miniatury brakuje górnej części obrazu (włosów, oczu).Jak korzystać z imagetu w php? (zmiana rozmiaru i kadrowanie)

Zastanawiałem się, jak zmienić rozmiar obrazu, a następnie go przyciąć. Ponadto muszę zachować stosunek wielkości obrazu.

Poniżej jest skrypt php używam do wysiewania:

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

Dzięki ..

+0

Jakie błędy dostaniesz? jaki jest oczekiwany wynik? Jaka wersja PHP? jest zainstalowany obraz? Więcej szczegółów, proszę ... –

+1

Nie, to nie jest błąd. imagick działa dobrze. Powyższy skrypt służy tylko do przycinania. Chcę najpierw ZMIEŃ ROZMIAR, a następnie chcę go przyciąć, więc brakuje mi pierwszego kroku. – newworroo

+0

Najpierw wywołaj 'imageResize', a następnie ... –

Odpowiedz

22

Zadanie to nie jest łatwe jako „ważne” część nie może być zawsze w tym samym miejscu. Mimo to, przy użyciu coś jak ten

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

(testowane)

powinno działać. Parametry cropImage (0 i 0) określają lewy górny róg obszaru przycinania. Zatem gra z nimi daje różne wyniki tego, co pozostaje na obrazie.

+1

Dziękuję !!! To jest idealne .. – newworroo

1

podstawie Martin's answer zrobiłem bardziej ogólną funkcję, która zmienia rozmiar i upraw Imagick obrazu w celu dopasowania daną szerokość i wysokość (czyli zachowuje się dokładnie tak, jak CSS background-size: cover deklaracji):

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

Nadzieja może pomóc komuś.

+1

'' imagick :: FILTER_LANCZOS'' powinno być '' \ Imagick :: FILTER_LANCZOS'' –