Позиционирование логотипа над другим изображением


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

позиция, в которой будет перекрываться reccibo в качестве параметров для каждого POST. Логотип, который я получаю, всегда является png, который может иметь или не иметь прозрачный фон, и тот же фон должен сохраняться.

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

код:

session_start();
$posiX =    $_POST['x'];
$posiY = $_POST['y'];

$datoImg = $_SESSION['genImg'];

$logo = $datoImg['logo']; //'logo.png'
$fondo = 'original.jpg';

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

function foto($img_original, $marcadeagua, $posiX, $posiY){
    $trozosimagenorig=explode(".",$img_original);
    $extensionimagenorig=$trozosimagenorig[count($trozosimagenorig)-1];
    if (preg_match("/jpg|jpeg|JPG|JPEG/", $extensionimagenorig)) {
        $imgm=imagecreatefromjpeg($img_original);
    }
    if (preg_match("/png|PNG/", $extensionimagenorig)) {
        $imgm=imagecreatefrompng($img_original);
    }
    if (preg_match("/gif|GIF/", $extensionimagenorig)) {
        $imgm=imagecreatefromgif($img_original);
    }

    $marcadeagua= imagecreatefrompng($marcadeagua);

    $xmarcaagua = $posiX;
    $ymarcaagua = $posiY;
    $ximagen= imagesx($imgm);
    $yimagen=imagesy($imgm);

    imagecopy($imgm, $marcadeagua, $xmarcaagua, $ymarcaagua,
     0, 0, $xmarcaagua, $ymarcaagua);
    //se copia la imagen
    imagejpeg($imgm,'../assets/originalrand.jpg');
}

полученный результат: создает эти черные пространства:

introducir la descripción de la imagen aquí

оригинальные изображения:

фоновое изображение:

introducir la descripción de la imagen aquí

изображение логотипа:

introducir la descripción de la imagen aquí

 5
Author: Mariano, 2017-05-17

1 answers

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

bool imagecopy ( resource $dst_im , resource $src_im , 
                      int $dst_x  , int $dst_y , 
                      int $src_x  , int $src_y , 
                      int $src_w  , int $src_h )

Я разделил аргументы, чтобы лучше читать. Первая строка принимает ресурсы изображений (обычно генерируемые с помощью imagecreatefrom***()). Затем позиции в пункте назначения, где будет находиться изображение ($dst_x , $dst_y), позиции, откуда он будет взят из источника ($src_x , $src_y), и размеры, которые должны быть взяты из источника ($src_w , $src_h).

Имея это ясно, остальное-найти эти значения (я комментирую код).


Код

<?php

//cambio los valores a unos fijos como prueba para que quede más claro
$posiX = 400;
$posiY = 150;
$logo = 'https://i.stack.imgur.com/g1TyX.png';
$fondo = 'https://i.stack.imgur.com/ChYVl.jpg';

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

function foto($img_original, $marcadeagua, $posiX, $posiY){
    //Crear el destino (fondo)
    if (preg_match("/\.jpe?g$/i", $img_original)) { //simplifiqué el regex
        $imgm = imagecreatefromjpeg($img_original);
    }
    elseif (preg_match("/\.png$/i", $img_original)) {
        $imgm = imagecreatefrompng($img_original);
    }
    elseif (preg_match("/\.gif$/i", $img_original)) {
        $imgm = imagecreatefromgif($img_original);
    }

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

    //las posiciones en donde ubicar - se reciben por POST (hardcoddeadas en este ejemplo)
    $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($imgm, $marcadeagua, 
              $xmarcaagua, $ymarcaagua,
              0, 0,
              $ximagen, $yimagen);


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


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


Результат

introducir la descripción de la imagen aquí

Я загрузил пример запуска на бесплатный хостинг: http://mariano.freevar.com/70835/



дополнительные услуги:

  1. Служить изображению

    Если вместо создания файла вы хотите, чтобы PHP служил изображение:

    header( "Content-type: image/jpeg" );
    imagejpeg($imgm);
    
  2. Создать прозрачный фон на логотипе, если у вас его нет

    Допустим, логотип имеет белый фон. Если бы мы хотели, чтобы весь белый был принят как прозрачный:

    //tomar el origen (logo)
    $marcadeagua= imagecreatefrompng($marcadeagua);
    
    // asignar un recurso con color blanco
    $fondoBlanco = imagecolorallocate($marcadeagua, 255, 255, 255);
    // Hacer que el blanco sea transparente
    imagecolortransparent($marcadeagua, $fondoBlanco);
    
    // y luego lo copiamos sobre la otra imagen ......
    
 5
Author: Mariano, 2017-05-17 22:50:14