Как разделить изображения и сохранить отдельно каждый кусок?
Вот так:

function newImage(int $width, int $height)
{
    $newimage = imagecreatetruecolor($width, $height);
    $transparent = imagecolorallocatealpha($newimage, 0, 0, 0, 127);
    imagefill($newimage, 0, 0, $transparent);
    imagealphablending($newimage, true);
    imagesavealpha($newimage, true);

    return $newimage;
}

function resize($image, int $width, int $height)
{
    $newImage = newImage($width, $height);
    imagecopyresampled($newImage, $image, 0, 0, 0, 0, $width, $height, imagesx($image), imagesy($image));

    return $newImage;
}

$imageFile = './donald_duck.png';
#$imageFile = './example.png';

[$filename, $ext] = explode('.', basename($imageFile));

$parts = [
    'horizontal' => 2,
    'vertical' => 4
];

$quality = 100; // качество в процентах [40 - 100]


$concurrentDirectory = __DIR__ . DIRECTORY_SEPARATOR . 'croped' . DIRECTORY_SEPARATOR . $filename;

// создаём дипекторию
if (!is_dir($concurrentDirectory)) {
    mkdir($concurrentDirectory, 777, true);
}

// ресурс изображения
$image = imagecreatefromstring(file_get_contents($imageFile));
imagesavealpha($image, true);
imagealphablending($image, false);

// размеры изображения
$x = imagesx($image);
$y = imagesy($image);

// округляем размеры, чтоб кусочки были одинаковые
$newX = ((int)($x / $parts['horizontal'])) * $parts['horizontal'];
$newY = ((int)($y / $parts['vertical'])) * $parts['vertical'];

// размеры кусочка
$picX = $newX / $parts['horizontal'];
$picY = $newY / $parts['vertical'];

$newImage = resize($image, $newX, $newY);

for ($i = 0, $horizontal = 0; $i < $parts['horizontal'] * $parts['vertical']; $i++) {
    $newPicture = newImage($picX, $picY);
    if ((($i % $parts['horizontal']) === 0) && ($i !== 0)) {
        $horizontal++;
    }
    $vertical = ($i !== 0) ? ($i % $parts['horizontal']) : $i;
    // вырезаем
    imagecopyresampled(
        $newPicture,
        $newImage,
        0,
        0,
        ($vertical * $picX),
        ($horizontal * $picY),
        $picX,
        $picY,
        $picX,
        $picY
    );
    // сохраняем
    imagepng(
        $newPicture,
        $concurrentDirectory . DIRECTORY_SEPARATOR . $filename . '_part' . ($i + 1) . '.png',
        (int)($quality / 11),
        PNG_ALL_FILTERS
    );
    imagedestroy($newPicture);
}




