Что может заставить php gd создать черное изображение после изменения размера? Следующий код всегда выводит черное изображение для каждого допустимого файла jpeg.
<?php $filename = 'test.jpg'; $percent = 0.5; header('Content-Type: image/jpeg'); list($width, $height) = getimagesize($filename); $newwidth = $width * $percent; $newheight = $height * $percent; $thumb = imagecreatetruecolor($newwidth, $newheight); $source = imagecreatefromjpeg($filename); imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); imagejpeg($thumb); imagedestroy($thumb); ?>
вывод gd_info()
:
Array ( [GD Version] => bundled (2.1.0 compatible) [FreeType Support] => 1 [FreeType Linkage] => with freetype [T1Lib Support] => [GIF Read Support] => 1 [GIF Create Support] => 1 [JPEG Support] => 1 [PNG Support] => 1 [WBMP Support] => 1 [XPM Support] => [XBM Support] => 1 [JIS-mapped Japanese Font Support] => )
Код появился в других средах. Вероятно, это связано с ОС, установленными пакетами, библиотеками и т. Д.?
Исследование
Просто попытался воспроизвести вашу ситуацию. Запуск кода с готовыми PHP и Apache отображает следующие
Изображение «
http://localhost/
» невозможно отобразить, поскольку оно содержит ошибки.
Хотя браузер говорит вам, что были некоторые ошибки, они не могут быть видны из-за того, что заголовки, возвращенные в ответ, были Content-Type: image/jpeg
заставляя браузер интерпретировать его как изображение. Удалив header
и настройку, следующие будут выдавать ошибки.
ini_set('error_reporting', E_ALL); ini_set('display_errors', true); ... //header('Content-Type: image/jpeg'); ...
Ответ
Что может заставить php gd создать черное изображение после изменения размера?
Поскольку вывод gd_info
доказывает, что расширение GD загружено, проверьте, правильно ли указано имя файла (linux is caseSensitive) и разрешения. Если Apache
работает как www-data
(group)
sudo chown :www-data test.jpg && sudo chmod 660 test.jpg
Улучшение / решение кода
ini_set('error_reporting', E_ALL); ini_set('display_errors', true); if (extension_loaded('gd') && function_exists('gd_info')) { $filename = 'test.jpg'; if (file_exists($filename) && is_readable($filename)) { $percent = 0.5; header('Content-Type: image/jpeg'); list($width, $height) = getimagesize($filename); $newwidth = $width * $percent; $newheight = $height * $percent; $thumb = imagecreatetruecolor($newwidth, $newheight); $source = imagecreatefromjpeg($filename); imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); imagejpeg($thumb); imagedestroy($thumb); } else { trigger_error('File or permission problems'); } } else { trigger_error('GD extension not loaded'); }
Комментарии
Это должно использоваться как временное решение (среда разработки). IMHO, ошибки должны обрабатываться центральным обработчиком ошибок, display_errors
должны быть false
в процессе производства. Кроме того, ошибки по умолчанию (в этом случае будет Fatal error
) регистрируются по умолчанию – проверьте журналы для большего (частые, тем лучше). Кроме того, на linux (с apt
) однострочный компьютер установит GD в вашу систему:
sudo apt-get update && sudo apt-get install php5-gd && sudo /etc/init.d/apache2 restart
Убедитесь, что gd установлен и включен.
Чтобы проверить, создайте файл PHP с помощью этой команды:
<?php phpinfo();
Получите доступ к файлу через браузер и прокрутите вниз до раздела gd. Если gd не существует или он отключен, добавьте его с помощью yum, apt-get или эквивалента Windows.
Вам также нужна библиотека GD ( http://www.libgd.org/ ).
Подумайте о переходе на IMagick ( http://php.net/manual/en/book.imagick.php ) для лучшего качества изображения.
Попробуйте этот код, чтобы увидеть ошибки, которые происходят:
<?php error_reporting(E_ALL); ini_set("display_errors", 1); $filename = 'test.jpg'; $percent = 0.5; list($width, $height) = getimagesize($filename); $newwidth = $width * $percent; $newheight = $height * $percent; $thumb = imagecreatetruecolor($newwidth, $newheight); $source = imagecreatefromjpeg($filename); imagecopyresized($thumb, $source, 0, 0, 0, 0, $newwidth, $newheight, $width, $height); //header('Content-Type: image/jpeg'); //imagejpeg($thumb); //imagedestroy($thumb); ?>
Итак, если PHP сталкивается с ошибкой, он отобразит его на экране. Если ошибки нет, на экране отобразится пустое.
Ниже функция создает миниатюру, с небольшими изменениями вы можете O / P на экране. Я думаю, что это более полезно.
/* * PHP function to resize an image maintaining aspect ratio * http://salman-w.blogspot.com/2008/10/resize-images-using-phpgd-library.html * * Creates a resized (eg thumbnail, small, medium, large) * version of an image file and saves it as another file */ define('THUMBNAIL_IMAGE_MAX_WIDTH', 150); define('THUMBNAIL_IMAGE_MAX_HEIGHT', 150); function generate_image_thumbnail($source_image_path, $thumbnail_image_path) { list($source_image_width, $source_image_height, $source_image_type) = getimagesize($source_image_path); switch ($source_image_type) { case IMAGETYPE_GIF: $source_gd_image = imagecreatefromgif($source_image_path); break; case IMAGETYPE_JPEG: $source_gd_image = imagecreatefromjpeg($source_image_path); break; case IMAGETYPE_PNG: $source_gd_image = imagecreatefrompng($source_image_path); break; } if ($source_gd_image === false) { return false; } $source_aspect_ratio = $source_image_width / $source_image_height; $thumbnail_aspect_ratio = THUMBNAIL_IMAGE_MAX_WIDTH / THUMBNAIL_IMAGE_MAX_HEIGHT; if ($source_image_width <= THUMBNAIL_IMAGE_MAX_WIDTH && $source_image_height <= THUMBNAIL_IMAGE_MAX_HEIGHT) { $thumbnail_image_width = $source_image_width; $thumbnail_image_height = $source_image_height; } elseif ($thumbnail_aspect_ratio > $source_aspect_ratio) { $thumbnail_image_width = (int) (THUMBNAIL_IMAGE_MAX_HEIGHT * $source_aspect_ratio); $thumbnail_image_height = THUMBNAIL_IMAGE_MAX_HEIGHT; } else { $thumbnail_image_width = THUMBNAIL_IMAGE_MAX_WIDTH; $thumbnail_image_height = (int) (THUMBNAIL_IMAGE_MAX_WIDTH / $source_aspect_ratio); } $thumbnail_gd_image = imagecreatetruecolor($thumbnail_image_width, $thumbnail_image_height); imagecopyresampled($thumbnail_gd_image, $source_gd_image, 0, 0, 0, 0, $thumbnail_image_width, $thumbnail_image_height, $source_image_width, $source_image_height); imagejpeg($thumbnail_gd_image, $thumbnail_image_path, 90); imagedestroy($source_gd_image); imagedestroy($thumbnail_gd_image); return true; }
См. Дополнительную информацию.
Если php-gd не существует, используйте следующую команду.
sudo apt-get install php5-gd