PHP GD несколько изображений с белым фоном - предупреждения? - PullRequest
0 голосов
/ 16 марта 2012

Я использую php imagecolorallocate () и imagefill () при загрузке изображений, чтобы файлы png также имели белый фон (как в этом посте: imagescreatetruecolor с белым фоном )

Вот часть кода, к которой он относится:

    //create new images
    $nimgac_0=imagecreatetruecolor($maxw_img0,$maxh_img0); //img1
    $nimgac_1=imagecreatetruecolor($maxw_img1,$maxh_img1); //img2
    $nimgac_2=imagecreatetruecolor($maxw_img2,$maxh_img2); //img3

    $nimgaa_0=imagecolorallocate($nimgac_0,255,255,255);
    $nimgaa_1=imagecolorallocate($nimgac_1,255,255,255);
    $nimgaa_2=imagecolorallocate($nimgac_2,255,255,255);

    $nimga_0=imagefill($nimgac_0,0,0,$nimgaa_0);
    $nimga_1=imagefill($nimgac_1,0,0,$nimgaa_1);
    $nimga_2=imagefill($nimgac_2,0,0,$nimgaa_2);

    //create images from temp folder
        if ($type=="jpg") {
            $nimgb_0=imagecreatefromjpeg("../imga/".$_FILES['file']['name']);
            $nimgb_1=imagecreatefromjpeg("../imga/".$_FILES['file']['name']);
            $nimgb_2=imagecreatefromjpeg("../imga/".$_FILES['file']['name']);
        }

        if ($type=="png") {
            $nimgb_0=imagecreatefrompng("../imga/".$_FILES['file']['name']);
            $nimgb_1=imagecreatefrompng("../imga/".$_FILES['file']['name']);
            $nimgb_2=imagecreatefrompng("../imga/".$_FILES['file']['name']);
        }


    imagecopyresized($nimga_0,$nimgb_0,0,0,0,0,$nwidth_0,$nheight_0,$width,$height);
    imagecopyresized($nimga_1,$nimgb_1,0,0,0,0,$nwidth_1,$nheight_1,$width,$height);
    imagecopyresized($nimga_2,$nimgb_2,0,0,0,0,$nwidth_2,$nheight_2,$width,$height);

    imagejpeg($nimga_0,"../imga/".$_FILES['file']['name'],80);
    imagejpeg($nimga_1,"../imga/".$imgname_1,80);
    imagejpeg($nimga_2,"../imga/".$imgname_2,80);

но я получаю это предупреждение:

Предупреждение: imagecopyresized () ожидает, что параметр 1 будет ресурсом, логическое значение в ... в строке 114

Предупреждение: imagecopyresized () ожидает, что параметр 1 будет ресурсом, логическое значение в ... в строке 115

Предупреждение: imagecopyresized () ожидает, что параметр 1 будет ресурсом, логическое значение в ... в строке 116

Предупреждение: imagejpeg () ожидает, что параметр 1 будет ресурсом, учитывая логическое значение в ... на линии 117

Предупреждение: imagejpeg () ожидает, что параметр 1 будет ресурсом, учитывая логическое значение в ... на линии 118

Предупреждение: imagejpeg () ожидает, что параметр 1 будет ресурсом, учитывая логическое значение в ... на линии 119

Предупреждение: imagedestroy () ожидает, что параметр 1 будет ресурсным, логическое значение дано в ... в строке 120

Предупреждение: imagedestroy () ожидает, что параметр 1 будет ресурсным, логическое значение дано ... по линии 121

Предупреждение: imagedestroy () ожидает, что параметр 1 будет ресурсным, логическое значение дано в ... в строке 122

Тот же код без immagecolorallocate () и imagefill () работает отлично. Тем не менее, я не могу найти ни ошибок, ни каких-либо различий в приведенном выше коде.

У кого-нибудь есть идеи? Заранее спасибо!

PS: я хочу сохранить все изображения в формате jpg, поэтому я также конвертирую pngs в jpg.

РЕДАКТИРОВАТЬ 3 (извините, я запутался):

print_r(getimagesize($_FILES['file']['tmp_name'])); возвращает

Массив ([0] => 354 [1] => 332 [2] => 2 [3] => ширина = "354" высота = "332" [биты] => 8 [каналов] => 3 [mime] => image / jpeg)

итак, все нормально с if($size['2']==3) {$type="jpg";} ...

Ответы [ 2 ]

1 голос
/ 17 марта 2012

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

По сути, в моем коде было $nimga_0=imagefill($nimgac_0,0,0,$nimgaa_0);, тогда как imagefill - это bool. Итак, imagefill был успешным, и я присвоил его значение 1 $ nimga_0, а затем хотел использовать 1 в качестве ресурса в imagecopyresized($nimga_0,$nimgb_0,0,0,0,0,$nwidth_0,$nheight_0,$width,$height);.

Конечно, это не может быть действительным источником. Все, что мне нужно было изменить - это оставить все как есть и просто сделать:

imagefill($nimgac_0,0,0,$nimgaa_0);

ШАГ ЗА ШАГОМ

Я создал холст с

$nimgac_0=imagecreatetruecolor($maxw_img0,$maxh_img0);

затем белый цвет с

$nimgaa_0=imagecolorallocate($nimgac_0,255,255,255);

, а затем просто нужно было заполнить холст цветом, используя

imagefill($nimgac_0,0,0,$nimgaa_0);

Затем я копирую загруженное изображение с

$nimgb_0=imagecreatefromjpeg("../imga/".$_FILES['file']['name']);

затем скопируйте загруженное изображение на холст (теперь белого цвета)

imagecopyresized($nimgac_0,$nimgb_0,0,0,0,0,$nwidth_0,$nheight_0,$width,$height);

и сохранить как JPG

imagejpeg($nimgac_0,"../imga/".$_FILES['file']['name'],80); 

и, наконец, очистить кэш

imagedestroy($nimgac_0);

Надеюсь, это поможет кому-то еще :)

1 голос
/ 16 марта 2012

«Булево заданное» обычно означает, что операция завершилась неудачно и вместо возврата дескриптора GD вернула логическое значение «ложь». Затем вы используете это ложное значение в другом месте в другом вызове GD и получите это предупреждение.

Итак, посмотрите, какая строка в этом коде находится в вашей строке 114, выясните, откуда взялся используемый вами дескриптор GD, а затем выясните, почему операция, которая должна была сгенерировать этот дескриптор, выдает ложное значение.


хорошо, с тем, что вышло из комментариев ниже, вот ваша проблема:

$size = getimagesize($_FILES[ blah blah blah]);

возвращает массив. Затем вы сравниваете этот массив с int:

$size == 2

, который потерпит неудачу. Таким образом, $ type выходит пустым. Это означает, что ни одна из функций imagecreatefXXX () не вызывается, и ваши дескрипторы изображения $ nimgb_XXX никогда не будут определены.

Однако вы передаете эти неопределенные переменные-дескрипторы в другие функции GD, а затем получаете предупреждение. Каким-то образом автоматически созданные null значения, которые PHP помещает в эти переменные, сообщаются библиотекой GD как FALSE.

Ваш код должен быть таким:

$info = getimagesize(...);
switch($info['type']) {
    case IMGTYPE_JPG:
         $nimgb_0=imagecreatefromjpeg("../imga/".$_FILES['file']['name']);
         $nimgb_1=imagecreatefromjpeg("../imga/".$_FILES['file']['name']);
         $nimgb_2=imagecreatefromjpeg("../imga/".$_FILES['file']['name']);
         break;
    case IMGTYPE_PNG:
         etc....
    default:
         die("Unsupported file type");
}

Константы IMGTYPE _... задокументированы здесь: http://php.net/manual/en/image.constants.php

...