Wydajna zmiana obrazów JPEG w PHP

Jaki jest najbardziej wydajny sposób zmiany rozmiaru dużych obrazów w PHP?

Obecnie używamGD funkcja imagecopyresampled do robienia zdjęć o wysokiej rozdzielczości i czyste zmienianie ich rozmiaru do rozmiaru do oglądania w Internecie (około 700 pikseli szerokości i 700 pikseli wysokości).

Działa to doskonale na małych (poniżej 2 MB) zdjęciach, a cała operacja zmiany rozmiaru zajmuje mniej niż sekundę na serwerze. Witryna będzie jednak w końcu obsługiwać fotografów, którzy mogą przesyłać obrazy o rozmiarze do 10 MB (lub obrazy o rozmiarze do 5000 x 4000 pikseli).

Wykonanie tego rodzaju operacji zmiany rozmiaru z dużymi obrazami ma tendencję do zwiększania wykorzystania pamięci o bardzo duży margines (większe obrazy mogą zwiększyć wykorzystanie pamięci dla skryptu po 80 MB). Czy jest jakiś sposób na zwiększenie wydajności operacji zmiany rozmiaru? Czy powinienem używać alternatywnej biblioteki obrazów, takiej jakImageMagick?

W tej chwili kod zmiany rozmiaru wygląda mniej więcej tak

function makeThumbnail($sourcefile, $endfile, $thumbwidth, $thumbheight, $quality) {
    // Takes the sourcefile (path/to/image.jpg) and makes a thumbnail from it
    // and places it at endfile (path/to/thumb.jpg).

    // Load image and get image size.
    $img = imagecreatefromjpeg($sourcefile);
    $width = imagesx( $img );
    $height = imagesy( $img );

    if ($width > $height) {
        $newwidth = $thumbwidth;
        $divisor = $width / $thumbwidth;
        $newheight = floor( $height / $divisor);
    } else {
        $newheight = $thumbheight;
        $divisor = $height / $thumbheight;
        $newwidth = floor( $width / $divisor );
    }

    // Create a new temporary image.
    $tmpimg = imagecreatetruecolor( $newwidth, $newheight );

    // Copy and resize old image into new image.
    imagecopyresampled( $tmpimg, $img, 0, 0, 0, 0, $newwidth, $newheight, $width, $height );

    // Save thumbnail into a file.
    imagejpeg( $tmpimg, $endfile, $quality);

    // release the memory
    imagedestroy($tmpimg);
    imagedestroy($img);

questionAnswers(9)

yourAnswerToTheQuestion