2012-03-16 2 views
0

Я использую PHP ImageColorAllocate() и imagefill() в загрузке изображения также позволяют PNG файлы имеют белый фон (как в этом посте: imagescreatetruecolor with a white background)PHP GD несколько изображений с белым фоном - предупреждения?

Вот часть кода это касается:

//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'])); возвращает

Array ([0] => 354 [1] => 332 [2] => 2 [3] = > ширина = "354" высота = "332" [бит] => 8 [каналы] => 3 [мим] => изображение/JPEG)

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

ответ

1

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

В принципе, у меня был $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); 

STEP BY STEP

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

$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

"Boolean given" обычно означает, что операция завершилась неудачно, и вместо того, чтобы возвращать дескриптор GD, возвращается логическое значение false. Затем вы используете это ложное значение в другом месте другого GD-вызова и получаете это предупреждение.

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


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

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

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

$size == 2 

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

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

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

$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

+0

Спасибо Марка, это линия с imagecopyresized(). Поскольку предупреждение не возникает, если я не использую выделение изображений и imagefill, я думал, что это должно быть из-за них? – Chris

+0

В этом случае возникает предупреждение, но фактическая проблема возникла раньше, когда предыдущий вызов GD завершился неудачно и вернул ложное значение. Вам нужно будет выяснить, какой из аргументов, вызванных копированием, вызывает его (src img, dst img и т. Д.), А затем выяснить, почему он получил ложное значение ранее. –

+0

да, я думаю, как будто это должно быть из-за imagecolorallocate() и imagefill() как одного и того же кода без этих двух вызовов, работает отлично ... поэтому я упомянул о другом вопросе в переполнении стека. Я думал, что мой код точно такой, как есть, но, вероятно, у меня есть некоторая ошибка ... как я могу узнать, что заставляет их терпеть неудачу? – Chris

Смежные вопросы