Проблема с 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 answers
Проблема возникает из-за использования list()
в PHP7
его поведение было изменено и больше не может использоваться с indices типа string.
Поскольку 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.