The problem is this: the script changes the image size, but the site instead of the image is a black square (exactly the size that should be). Where is the mistake?

if (empty($_FILES['fupload']['name'])) { //если переменной не существует (пользователь не отправил изображение),то присваиваем ему заранее приготовленную картинку с надписью "нет аватара" $avatar = "avatars/net-avatara.jpg"; //можете нарисовать net-avatara.jpg или взять в исходниках } else { //иначе - загружаем изображение пользователя $path_to_90_directory = 'avatars/'; //папка, куда будет загружаться начальная картинка и ее сжатая копия if (preg_match('/[.](JPG)|(jpg)|(gif)|(GIF)|(png)|(PNG)$/', $_FILES['fupload']['name'])) //проверка формата исходного изображения { $filename = $_FILES['fupload']['name']; $source = $_FILES['fupload']['tmp_name']; $target = $path_to_90_directory . $filename; move_uploaded_file($source, $target); //загрузка оригинала в папку $path_to_90_directory if (preg_match('/[.](GIF)|(gif)$/', $filename)) { $im = imagecreatefromgif($path_to_90_directory . $filename); //если оригинал был в формате gif, то создаем изображение в этом же формате. Необходимо для последующего сжатия } if (preg_match('/[.](PNG)|(png)$/', $filename)) { $im = imagecreatefrompng($path_to_90_directory . $filename); //если оригинал был в формате png, то создаем изображение в этом же формате. Необходимо для последующего сжатия } if (preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/', $filename)) { $im = imagecreatefromjpeg($path_to_90_directory . $filename); //если оригинал был в формате jpg, то создаем изображение в этом же формате. Необходимо для последующего сжатия } //СОЗДАНИЕ КВАДРАТНОГО ИЗОБРАЖЕНИЯ И ЕГО ПОСЛЕДУЮЩЕЕ СЖАТИЕ ВЗЯТО С САЙТА www.codenet.ru // Создание квадрата 90x90 // dest - результирующее изображение // w - ширина изображения // ratio - коэффициент пропорциональности // квадратная 90x90. Можно поставить и другой размер. // создаём исходное изображение на основе // исходного файла и определяем его размеры $w_src = imagesx($im); //вычисляем ширину $h_src = imagesy($im); //вычисляем высоту изображения // создаём пустую квадратную картинку // важно именно truecolor!, иначе будем иметь 8-битный результат $dest = imagecreatetruecolor($w, $h); // вырезаем квадратную серединку по x, если фото горизонтальное if ($w_src > $h_src) { $w = 800; $h = 534; imagecopyresampled($dest, $im, 0, 0, round((max($w_src, $h_src) - min($w_src, $h_src)) / 2), 0, $w, $h, min($w_src, $h_src), min($w_src, $h_src)); $dest = imagecreatetruecolor($w, $h); } // вырезаем квадратную верхушку по y, // если фото вертикальное (хотя можно тоже серединку) if ($w_src < $h_src) { $w = 532; $h = 800; imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $h, min($w_src, $h_src), min($w_src, $h_src)); $dest = imagecreatetruecolor($w, $h); } // квадратная картинка масштабируется без вырезок if ($w_src == $h_src) { $w = 800; $h = 534; imagecopyresampled($dest, $im, 0, 0, 0, 0, $w, $h, $w_src, $w_src); $dest = imagecreatetruecolor($w, $h); } $dat = date(); $date = time(); //вычисляем время в настоящий момент. imagejpeg($dest, $path_to_90_directory . $_POST["login"] . $dat . $date . "1.jpg"); //сохраняем изображение формата jpg в нужную папку, именем будет текущее время. Сделано, чтобы у аватаров не было одинаковых имен. //почему именно jpg? Он занимает очень мало места + уничтожается анимирование gif изображения, которое отвлекает пользователя. Не очень приятно читать его комментарий, когда краем глаза замечаешь какое-то движение. $avatar = $path_to_90_directory . $_POST["login"] . $dat . $date . "1.jpg"; //заносим в переменную путь до аватара. $delfull = $path_to_90_directory . $filename; unlink($delfull); //удаляем оригинал загруженного изображения, он нам больше не нужен. Задачей было - получить миниатюру. } else { //в случае несоответствия формата, выдаем соответствующее сообщение exit("Аватар должен быть в формате <strong>JPG,GIF или PNG</strong>"); //останавливаем выполнение сценариев } //конец процесса загрузки и присвоения переменной $avatar адреса загруженной авы } 
  • @LordyGL, To format a code, select it with the mouse and click on the button 101010 of the editor. - Nicolas Chabanovsky

1 answer 1

There is an obvious mistake:

 imagecopyresampled($dest, $im, 0, 0, round((max($w_src, $h_src) - min($w_src, $h_src)) / 2), 0, $w, $h, min($w_src, $h_src), min($w_src, $h_src)); $dest = imagecreatetruecolor($w, $h); 

it should be the other way around

 $dest = imagecreatetruecolor($w, $h); imagecopyresampled($dest, $im, 0, 0, round((max($w_src, $h_src) - min($w_src, $h_src)) / 2), 0, $w, $h, min($w_src, $h_src), min($w_src, $h_src)); 

that is, first create the image and then copy the area into it