Позиционирование логотипа над другим изображением
я заставляю пользователя загружать изображение логотипа, а затем пытаюсь позиционировать его поверх другого изображения, которое у меня есть на сервере.
позиция, в которой будет перекрываться 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');
}
полученный результат: создает эти черные пространства:
оригинальные изображения:
фоновое изображение:
изображение логотипа:
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 );
}
Результат
Я загрузил пример запуска на бесплатный хостинг: http://mariano.freevar.com/70835/
дополнительные услуги:
-
Служить изображению
Если вместо создания файла вы хотите, чтобы PHP служил изображение:
header( "Content-type: image/jpeg" ); imagejpeg($imgm);
-
Создать прозрачный фон на логотипе, если у вас его нет
Допустим, логотип имеет белый фон. Если бы мы хотели, чтобы весь белый был принят как прозрачный:
//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 ......