Intereting Posts
Как установить значение по умолчанию для столбца временной метки в текущую временную метку с миграциями Laravel? Переадресация категории Magento отключает запрос URL-адреса Работа в Cron в Ларавеле 4 Вызов функций-функций-членов () в массиве (Laravel 5.3) PHP и MySQL: оптимизация базы данных Как вернуть только имя файла с помощью glob () в php Получить идентификатор сообщения текущего пользователя и добавить ссылку в меню Как проверить, изменилось ли значение объекта JSON при захвате нового запроса Файл внешнего заголовка WordPress – изменить название? Слияние двух mp3-плееров MySQL Не удается подключиться к серверу на localhost с помощью PHP Как перенаправить другой способ на событие selectChange? Сайт Joomla на сервере LAMP за прокси-сервером не может получить доступ к потоку ресурсов HTTP Быстрее или лучше использовать MySQL вместо текстовых файлов или имен файлов для порядка изображений с PHP? MVC Design. Сколько контроллеров может / должно / должно быть иметь в проекте веб-приложения CodeIgniter MVC?

Почему этот базовый imagejpeg () resizer возвращает черное изображение?

РЕДАКТИРОВАТЬ

Спасибо за все ваши ответы, особенно @Mailerdaimon, которые заметили, что я не использовал вычисляемые значения в функции imagecopyresampled .

Я больше не получаю черных изображений, но у меня все еще есть черная часть, поэтому я считаю, что моя формула соотношения должна быть обновлена: если я загружу ландшафтное изображение, высота нового изображения меньше 170 пикселей, а затем появится черный показ.

Как я могу убедиться, что высота изображения идет полностью?


Ниже приведен простой сценарий, позволяющий пользователям загружать фотографии . После завершения загрузки изображения отображаются как миниатюра 170px (h) x 150px (w).

Часть изменения размера работает, поскольку выходное изображение равно 170x150px, но я все равно получаю черную область, если

 if ($_SERVER["REQUEST_METHOD"] == "POST") { $maxWidth = 150; $maxHeight = 170; $name = $_FILES ['image'] ['name']; $type = $_FILES ["image"] ["type"]; $size = $_FILES ["image"] ["size"]; $tmp_name = $_FILES ['image'] ['tmp_name']; list($originalWidth, $originalHeight) = getimagesize($tmp_name); if ($originalWidth > $originalHeight) { $thumbnail_height = floor(($originalHeight/$originalWidth)*$maxWidth); $thumbnail_width = $maxWidth; } else { $thumbnail_width = floor(($originalWidth/$originalHeight)*$maxHeight); $thumbnail_height = $maxHeight; } // Resample $image_p = imagecreatetruecolor($maxWidth, $maxHeight); imagecreatefrompng($tmp_name); imagecopyresampled($image_p, 0, 0, 0, 0, $thumbnail_width, $thumbnail_height, $originalWidth, $originalHeight); //start upload process $RandomNumber = uniqid(); $location = "uploads/$RandomNumber"; imagejpeg($image_p, $location, 100); $sql=query("UPDATE users SET image = '".$location."' WHERE id = '$id'"); } } 

Любая идея, что я делаю неправильно?

Solutions Collecting From Web of "Почему этот базовый imagejpeg () resizer возвращает черное изображение?"

Я никогда не использовал php, так что это может быть неверно, но я не вижу, где вы используете рассчитанные значения для ширины и высоты!

 if ($originalWidth > $maxWidth || $originalHeight > $maxHeight) { if ($originalWidth / $maxWidth > $originalHeight / $maxHeight) { // width is the limiting factor $width = $maxWidth; $height = floor($width * $originalHeight / $originalWidth); } else { // height is the limiting factor $height = $maxHeight; $width = floor($height * $originalWidth / $originalHeight); } 

здесь вы вычисляете высоту и ширину, и после этого они не отображаются нигде в вашем коде …

EDIT: вы используете:

 $image_p = imagecreatetruecolor($maxWidth, $maxHeight); imagecreatefrompng($tmp_name); imagecopyresampled($image_p, 0, 0, 0, 0, $thumbnail_width, $thumbnail_height,$originalWidth, $originalHeight); 

Но документация imagecopyresmapled гласит, что функция принимает следующее

 imagecopyresampled ($dst_image ,$src_image ,$dst_x ,$dst_y ,$src_x ,$src_y ,$dst_w , $dst_h ,$src_w ,$src_h ) 

Хотя я думаю, что ваш код должен быть

 imagecopyresampled($image_p,$tmp_name, 0, 0, 0, 0, $thumbnail_width, $thumbnail_height,$originalWidth, $originalHeight); 

как уже упоминалось @Manolo Salsas (и несколько других)

EDIT2: еще одна проблема заключается в том, как вы вычисляете значения Heigth и Width. если $height вычисляется, нравится это

 $height = floor($width * $originalHeight / $originalWidth); 

он может быть меньше $maxHeight , хотя и создает черную (незаполненную) область в вашем итоговом изображении, так как вы создали это изображение, используя максимальные значения

 $image_p = imagecreatetruecolor($maxWidth, $maxHeight); 

Чтобы исправить это, используйте рассчитанные значения $ thumbnail_height и $ thumbnail_width для создания изображения

  $image_p = imagecreatetruecolor($thumbnail_width, $thumbnail_height); 

или всегда изменяйте размер изображения до максимальных значений

 imagecopyresampled($image_p,$tmp_name, 0, 0, 0, 0, $maxWidth, $maxHeight,$originalWidth, $originalHeight); 

которые могут искажать изображение. Если вы не хотите, чтобы изображение исказилось, сначала подумайте об изменении размера, чтобы размер поместился в миниатюре, а затем обрезал более длинную сторону.

  1. Убедитесь, что папка «uploads» доступна для записи или принадлежит веб-серверу
  2. Попробуйте использовать абсолютный путь: / var / www / mysite / uploads
  3. Попытайтесь использовать что-то другое для случайного id, например хеш или md5 идентификатора строки или самого изображения, чтобы избежать двуличности.

Вы можете изменить последнюю часть:

$ RandomNumber = md5 ($ image_p); $ location = "/ var / www / mysite / uploads / $ RandomNumber"; if (imagejpeg ($ image_p, $ location, 100)) {
query ("UPDATE users SET image = '". $ location. "' WHERE id = '$ id'"); }

Прежде всего,

@getimagesize($_FILES['userfile']['tmp_name']))

Эта функция проверяет, является ли файл реальным изображением (а не только расширением). Если файл не является изображением, он вернет false (и предупреждение, поэтому at).

Если файл является реальным изображением, можно вернуть его, если хотите:

 list($width, $height, $type, $attributes) = @getimagesize($_FILES['userfile']['tmp_name'])) 

или просто размер:

 $size = @getimagesize($_FILES['userfile']['tmp_name'])) 

Поэтому, если вы используете эту функцию, не забудьте добавить значение at и использовать условие if чтобы проверить, действительно ли вы получаете реальный образ.

С другой стороны, после проверки того, что вы получаете реальное изображение и меньше размера, который вы хотите, вы можете сделать:

 if(move_uploaded_file($_FILES['userfile']['tmp_name'], $imagePath) 

где $imagePath – это путь, по которому вы хотите $imagePath изображение.

Затем вы можете:

 $image = imagecreatefromjpeg($imagePath); $canvas=imagecreatetruecolor($maxwidth,$maxheight); imagecopyresampled($canvas, $image ,0,0,0,0,$maxwidth, $maxheight, $originalWidth, $originalHeight); 

И у вас будет правильный размер изображения.