Изменение размера с помощью GD-выходов

Что может заставить 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