2015-06-19 3 views
21

Что может заставить php gd создать черное изображение после изменения размера? Следующий код всегда выводит черное изображение для каждого допустимого файла jpeg.Изменение размера с помощью выходов GD черные изображения

<?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] => 
) 

Код появились работы в других средах. Вероятно, это связано с ОС, установленными пакетами, библиотеками и т. Д.?

+0

Код прекрасно работает здесь. : -/'PHP 5.3.29'' GD Версия: в комплекте (совместимо с 2.1.0) ' –

+0

Также работает с HHVM, HipHop VM 3.6.1 (rel) – codeaken

+0

Вы проверили файл журнала? – hek2mgl

ответ

7
Исследования

Просто попытался воспроизвести вашу ситуацию. Запуск кода с вне коробки 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_info выход доказывает, что GD extension загружается, проверьте, если имя файла (Linux является CaseSensitive) и разрешения являются правильными. Если Apache работает как www-data (группа)

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 
0

Убедитесь, что gd установлен и включен.

Чтобы проверить, создать PHP-файл с помощью следующей команды:

<?php phpinfo(); 

доступ к файлу через браузер и прокрутите вниз до раздела Gd. Если gd не существует или он отключен, добавьте его с помощью yum, apt-get или эквивалента Windows.

Вам также нужна библиотека GD (http://www.libgd.org/).

Рассмотрите возможность переключения на IMagick (http://php.net/manual/en/book.imagick.php) для лучшего качества изображения.

0

Попробуйте этот код, чтобы увидеть ошибки, которые происходят:

<?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 наталкивается ошибку, он будет показывать на экране. Если ошибки нет, на экране отобразится пустое.

+0

error_reporting установит уровень отчетности. См. Http://php.net/manual/en/function.error-reporting.php – sitilge

+0

О, я забыл о директиве 'display_errors', просто добавил ее в код (интересно, если это о чем вы говорили?) – Dinei

0

Ниже функции создает эскиз, с некоторыми изменениями, вы можете 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 (e.g. 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; 
} 

Refer this more информация.

Если php-gd не существует, используйте следующую команду.

sudo apt-get install php5-gd 
Смежные вопросы