Проблема с imagecopy () выдает ошибку


у меня есть эта функция, но при ее запуске я получаю эту ошибку :

Imagedestroy (): supplied argument is not valid Image resource

Imagecopy (): supplied argument is not valid Image resource

Imagejpeg (): supplied argument is not valid Image resource

<?php 
$posiX=400;
$posiY=150;

$logo="http://dominio.com/images/ejemplo.png";
 $fondo"http://dominio.com/images/ejemplo.jpg"; 
foto($fondo, $logo, $posiX, $posiY);

function foto($img_original, $marcadeagua, $posiX, $posiY){


list($old_x, $old_y, $type) = getimagesize($img_original);
    switch ($type)
    {
        case 'jpg':   //   gif -> jpg
            $src_img = imagecreatefromjpg($img_original);
            break;

        case 'jpeg':   //   jpeg -> jpg
            $src_img = imagecreatefromjpeg($img_original); 
            break;

        case 'png':  //   png -> jpg
            $src_img = imagecreatefrompng($img_original);
            break;
    }

//tomar el origen (logo)
$marcadeagua= imagecreatefrompng($marcadeagua);

//las posiciones en donde ubicar - se reciben por POST
$xmarcaagua = $posiX;
$ymarcaagua = $posiY;

//se obtiene el ancho y el largo del logo
$ximagen = imagesx($marcadeagua);
$yimagen = imagesy($marcadeagua);

//COPIAR (observar las variables que se usan)
imagecopy($src_img, $marcadeagua, $xmarcaagua, $ymarcaagua,0, 0,
          $ximagen, $yimagen); // linea donde se genera el error imagecopy()


//Generar el archivo
imagejpeg($src_img, '../images/originalrand.jpg');


//faltaba destruirla (hay que ser prolijos)
imagedestroy( $src_img );
 }


 ?>

что происходит? я не понимаю, что я делаю не так .

 1
Author: Comunidad, 2017-12-14

1 answers

Проблема возникает из-за использования list() в PHP7 его поведение было изменено и больше не может использоваться с indices типа string.

Просмотр заметок list()

Поскольку list() был отменен, он не назначает вам значения, которые вы ожидаете в переменных, поэтому никакие условия case не выполняются и никогда не выполняются imagecreatefrom_*().

Сначала давайте посмотрим, что он возвращает нам getimagesize($img_original) с png-изображением шириной 200 пикселей и 100 пикселей высокий:

Array
(
    [0] => 200 // Ancho
    [1] => 100 // Alto
    [2] => 3
    [3] => width="200" height="100"
    [bits] => 8
    [mime] => image/png
)

Данные, которые нас интересуют в массиве, - это mime [mime] => image/png, ширина [0] => 200 и высота [1] => 100. Зная это, давайте исправим некоторые вещи из функции:

function foto($img_original, $marcadeagua, $posiX, $posiY) {
    // list($old_x, $old_y, $type) = getimagesize($img_original);

    //optenemos array con la info
    $info = getimagesize($img_original);
    // pasamos el mime al switch y corregimos los case, ñadmos un default
    switch ($info['mime'])
    {
        case 'image/jpg':
            $src_img = imagecreatefromjpg($img_original);
            break;
        case 'image/jpeg':
            $src_img = imagecreatefromjpeg($img_original); 
            break;
        case 'image/png':
            $src_img = imagecreatefrompng($img_original);
            break;
        default:
            return false;
    }

    //tomar el origen (logo)
    $marcadeagua= imagecreatefrompng($marcadeagua);

    //las posiciones en donde ubicar - se reciben por POST
    $xmarcaagua = $posiX;
    $ymarcaagua = $posiY;

    //se obtiene el ancho y el largo del logo
    $ximagen = imagesx($marcadeagua);
    $yimagen = imagesy($marcadeagua);

    //COPIAR (observar las variables que se usan)
    imagecopy($src_img, $marcadeagua, $xmarcaagua, $ymarcaagua,0, 0,
              $ximagen, $yimagen); // linea donde se genera el error imagecopy()

    //Generar el archivo
    imagejpeg($src_img, 'originalrand.jpg');

    //faltaba destruirla (hay que ser prolijos)
    imagedestroy( $src_img );
}



foto($fondo, $logo, $posiX, $posiY);

Мы удалили list(), вместо этого у нас есть массив $info. В switch мы передаем полученный mime $info['mime'] и настраиваем case в соответствии с mimes.

 1
Author: Xerif, 2017-12-14 20:55:59