Обрезка фотографий на php достаточно сложная задача. Она подразумевает работу с координатами X и Y, по которым сначала скрипт должен создать пустую болванку изображения, а затем вписать в нее вашу текущую картинку.
Если честно, я очень замучился с кодом по обрезки фото. Брал разные скрипты с интернета и модифицировал код, пока не создал хорошую функцию с множеством полезных параметров, по которым легко обрезать любое изображение, даже в png формате.
Особенностью скрипта хочу отметить обрезку по центру квадрата наименьшей стороны, а также по своим координатам.
Обрезка фотографий на php
Создайте в корне сервера или денвера 2 папки original и rename и файл index.php в кодировке UTF-8 без BOM. В него добавьте код:
<?php header("Content-Type: text/html; charset=utf-8");
set_time_limit(0);
foreach (glob("original/*.{jpg,JPG,jpeg,JPEG,png,PNG,gif,GIF}", GLOB_BRACE) as $filename) {
crop($filename, "rename/".pathinfo($filename, PATHINFO_BASENAME), 'squarecentr', '', 90);
}
В glob() идет поиск картинок с указанными в нем расширениями. crop() выполняет обрезку фото со следующими параметрами:
- $filename - путь исходного файла
- "rename/".pathinfo($filename, PATHINFO_BASENAME) - путь конечного файла
- 'squarecentr' - обрезаем изображение до формы квадрата по центру изображения. Также возможны варианты: 'square' - тоже самое, только по левому верхнему краю; array(5,5,5,5) - по сторонам в пикселях (слева, сверху, справа, снизу)
- 90 - качество сохраняемого фото
После кода выше добавьте саму функцию обрезки:
//обрезка фото
function crop($file_input, $file_output, $crop = 'squarecentr', $percentcrop = false, $imgkashcrop) {
list($w_i, $h_i, $type) = getimagesize($file_input);
if ($w_i || $h_i) {
$types = array('','gif','jpeg','png');
$ext = $types[$type];
if ($ext) {
$func = 'imagecreatefrom'.$ext;
$img = $func($file_input);
if ($crop == 'squarecentr') {
$min = ($w_i > $h_i) ? $h_i : $w_i;
$w_new = $h_new = $min;
$x_o = intval(($w_i - $min) / 2);
$y_o = intval(($h_i - $min) / 2);}
else if ($crop == 'square') {
$min = $w_i;
if ($w_i > $h_i) $min = $h_i;
$w_new = $h_new = $min; }
else {
list($x_o, $y_o, $w_new, $h_new) = $crop;
if ($percentcrop) {
$w_new *= $w_i / 100;
$h_new *= $h_i / 100;
$x_o *= $w_i / 100;
$y_o *= $h_i / 100; }
if ($x_o < 0) {$x_o = 0; $w_new = $w_i;}
if ($y_o < 0) {$y_o = 0; $h_new = $h_i;}
if ($w_new < 0) {$w_new = $w_i; $x_o = 0;}
if ($h_new < 0) {$h_new = $h_i; $y_o = 0;}
if ($w_new + $x_o >= $w_i) {$x_o = 0; $w_new = $w_i; $y_o = 0; $h_new = $h_i;}
else if ($h_new + $y_o >= $h_i) {$y_o = 0; $h_new = $h_i; $x_o = 0; $w_new = $w_i;}
else {
if ($w_new > 0) {$w_new = $w_new*(-1) + $w_i; $w_new = $w_new - $x_o;}
else if ($w_new == 0) $w_new = $w_i - $x_o;
if ($h_new > 0) {$h_new = $h_new*(-1) + $h_i; $h_new = $h_new - $y_o;}
else if ($h_new == 0) $h_new = $h_i - $y_o;
}
}
$img_new = imagecreatetruecolor($w_new, $h_new);
if ($ext == "png") {
imagealphablending($img_new, false);
imagesavealpha($img_new, true); }
imagecopy($img_new, $img, 0, 0, $x_o, $y_o, $w_new, $h_new);
if ($type == 2) {
imagejpeg($img_new,$file_output,$imgkashcrop); imagedestroy($img_new); }
else {
$func = 'image'.$ext;
$func($img_new,$file_output); imagedestroy($img_new);
} }}
else echo 'Ошибка обработки...';
}
?>
Загрузите в папку original оригинальные картинки и запустите скрипт index.php. Если обработка пройдет успешно, то в папке rename появятся обрезанные изображения.
Вот таким способом можно массово обрезать фотографии предоставляемые пользователями, например через форму-загрузчик. Это очень удобно, если нужно создавать аватарки и миниатюры.