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