Подтвердить что ты не робот

Изменение размера с помощью 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] => 
)

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

4b9b3361

Ответ 1

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

Просто попытался воспроизвести вашу ситуацию. Запуск кода с готовыми 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 (группа)

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

Ответ 2

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

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

<?php phpinfo(); 

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

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

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

Ответ 3

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

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

Ответ 4

Ниже функция создает миниатюру, с небольшими изменениями вы можете 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;
}

Обратитесь эту дополнительную информацию.

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

sudo apt-get install php5-gd