Jump to content

Juntar imagens


John Hebert Trindade
Go to solution Solved by Ivo Vicente,

Recommended Posts

Boa tarde pessoa, pesquisei na internet mais o que achei foi muito coisa repetida e que não me ajudou.

tenho um código para fazer upload de imagens selecionada, salvar em uma determinada pasta e inserir o nome em uma BD.

Até aqui tudo bem, está a funcionar a 100%

Mais gostaria do seguinte.

Tenho o logotipo da empresa em um tamanho 200x200, quando o cliente adicionar as fotos gostaria que antes de fazer o upload ele mesclasse com o logotipo no final da imagem.

Dados:

as variáveis:

$_UP[‘pasta’] recebe de um select o nome da pasta

 

<?php		
	if(!is_dir($_UP['pasta'])){ 
		echo "Pasta $pasta nao existe";
	}else {
		$arquivo = isset($_FILES['arquivo']) ? $_FILES['arquivo'] : FALSE;

		for ($controle = 0; $controle < count($arquivo['name']); $controle++){
		$contador++;
        $nome_final = 'foto'.$contador.'.jpg';
        $destino = $_UP['pasta']."/".$nome_final;
        	if(move_uploaded_file($arquivo['tmp_name'][$controle], $destino)){
        		//Upload efetuado com sucesso, exibe a mensagem
        		$query = mysqli_query($con, "INSERT INTO $_UP['pasta'] (foto) VALUES('$nome_final')");
            }else{
            	$_SESSION['msg'] = "<p style='color:red;text-align:center;'>Upload não realizado</p>";
                header("location: upload.php");
            }
   }
   $_SESSION['msg'] = "<p style='color:green;text-align:center;'>Upload realizado com sucesso</p>";
   header("location: upload.php");
 }

Já tentei o imagecopymerge, mais não resultou, talvez eu tenha feito mal.

Se pudessem me ajudar agradecia, o logo esta na pasta “imgs” com o nome de “logomarca.PNG”

Link to comment
Share on other sites

Viva @John Hebert Trindade

Antes de aplicar marca de água, o sistema de upload está a funcionar? Os ficheiros ficam na pasta que lhes é destinada?

Só depois de existir no disco do servidor se torna seguro fazer manipulação de ficheiros, nem que seja uma pasta temporária.

Depois o imagecopymerge necessita da biblioteca GD2 para funcionar, é preciso ver se está disponível.

Podes testar criando um ficheiro para imprimir o phpinfo()

<?php
// file: info.php
phpinfo();

phpinfo_gd.png

Podes ainda investigar o uso do ImageMagick com recurso à biblioteca Imagick ou através de shell_exec invocando comandos para o efeito (mas tem que instalar no sistema operativo). Este artigo é super completo com Imagick

 

Vai dando novidades

Edited by Ivo Vicente

Feito é melhor que perfeito

Link to comment
Share on other sites

Sim Ivo, está a fazer o upload para a pasta de destino, já alterei tanto o código que já nem funciona e tenho a biblioteca.

a sorte é que fiz uma copia

também fiz um código para marca d’água e estava a funcionar o problema é ao juntar os dois.

Edited by John Hebert Trindade
Link to comment
Share on other sites

9 horas atrás, John Hebert Trindade disse:

Por favor ajude me se puder 

Já experimentou o exemplo sugerido na documentação do próprio PHP:

https://www.php.net/manual/en/image.examples.merged-watermark.php

Quando se utiliza PNG convém ter em atenção ao formato do mesmo, pois parece que o imagecopymerge não funciona com o PNG-24, sendo nesse caso utilizado o imagecopy, já se for PNG-8 parece que o imagecopymerge já funciona.

Existe uma livraria de uso simples que permite adicionar marcas de água a imagens e PDF chamada PHPWatermark: https://github.com/ajaxray/php-watermark

Contudo esta livraria exige a presença do ImageMagick.

 
  • Vote 1
Link to comment
Share on other sites

  • Solution

Se tens os dois blocos a funcionar em separado, o que falta para os juntar?

 

Se partir do pressuposto que apenas precisa do ficheiro que é enviado por upload, isolas a criação da marca de água numa função ou numa classe, e no fim do upload já fazes INSERT em base de dados, basta invocar a função ou classe com a localização do ficheiro de imagem.

<?php 
// Processo principal

function createWatermarkImage($originalFile){
  // Código de marca de água
}

//.... 
 $destino = $_UP['pasta']."/".$nome_final;
        	if(move_uploaded_file($arquivo['tmp_name'][$controle], $destino)){
        		//Upload efetuado com sucesso, exibe a mensagem
        		$query = mysqli_query($con, "INSERT INTO $_UP['pasta'] (foto) VALUES('$nome_final')");
              // chama a função de marca de água
              createWatermarkImage($destino);
            }else{
//....

Mais que isto temos que ver mais código que esteja feito do teu lado

Edited by Ivo Vicente

Feito é melhor que perfeito

Link to comment
Share on other sites

O problema é que não sei juntar os dois código, e quando junto não da erro e fico sem saber o que esta errado. Esse é o código completo e não faz o upload e nem coloca a marca d’água. Só que se fizer separado funciona.

<?php
//inicia a sessao
session_start();

//zera o contador
$contador = 0;

//recebe o nome da pasta do select
$pasta = $_POST['datatable'];

//cria o link com o endereço da pasta a ser guardadas as imagens
$diretorio = 'imgs/bebes/'.$pasta.'/';

if(!is_dir($diretorio)){ 
	//verifica se a pasta existe
	$_SESSION['msg'] = "<p style='color:red;text-align:center;'>A pasta $pasta não existe</p>";
	header("location: upload.php");
}else{
	$arquivo = isset($_FILES['arquivo']) ? $_FILES['arquivo'] : FALSE;
	for ($controle = 0; $controle < count($arquivo['name']); $controle++){
		function createWatermarkImage($originalFile){
			// Código de marca de água
			$imagem = $_FILES['arquivo']['name'];
			switch($_FILES['arquivo']['type']):
				case 'image/jpeg';
				case 'image/pjpeg';
				//Criar a imagem temporaria a ser manipulada
				$imagem_temporaria = imagecreatefromjpeg($_FILES['arquivo']['tmp_name']);
				break;
				case 'image/png';
				case 'image/x-png';
				//Criar a imagem temporaria a ser manipulada
				$imagem_temporaria = imagecreatefrompng($_FILES['arquivo']['tmp_name']);
				break;
		default:
			$_SESSION['msg'] = "<h3 style='color: red;'>Extensão da imagem inválida, a extensão deve ser JPG ou PNG</h3>";
			header("Location: upload.php");
	endswitch;
	
	
	
	//Importar a logo
	$logo = imagecreatefromgif("imgs/logomarca.gif");
	
	//Obter a largura da logo
	$largura_logo = imagesx($logo);
	
	//Obter a altura da logo
	$altura_logo = imagesy($logo);
	//echo "$altura_logo - $largura_logo";
	
	//Calcular posição x sendo 15px da lateral direita
	$x_logo = imagesx($imagem_temporaria) - $largura_logo - 15;
	
	//Calcular posição y sendo 15px do rodape
	$y_logo = imagesy($imagem_temporaria) - $altura_logo - 15;
	
	imagecopymerge($imagem_temporaria, $logo, $x_logo, $y_logo, 0, 0, $largura_logo, $altura_logo, 70);
	
	imagejpeg($imagem_temporaria, $diretorio. $_FILES['arquivo']['name']);

		}
		$contador++;
        $nome_final = 'foto'.$contador.'.jpg';
        $destino = $_UP['pasta']."/".$nome_final;
        	if(move_uploaded_file($arquivo['tmp_name'][$controle], $destino)){
        		//Upload efetuado com sucesso, exibe a mensagem
        		$query = mysqli_query($con, "INSERT INTO $pasta (foto) VALUES('$nome_final')");
				// chama a função de marca de água
				createWatermarkImage($destino);
            }else{
            	$_SESSION['msg'] = "<p style='color:red;text-align:center;'>Upload não realizado</p>";
                header("location: upload.php");
            }
	}
	$_SESSION['msg'] = "<p style='color:green;text-align:center;'>Upload realizado com sucesso</p>";
	header("location: upload.php");
}

?>
  Edited by John Hebert Trindade
Link to comment
Share on other sites

  • 2 weeks later...
Em 25/10/2021 às 08:26, John Hebert Trindade disse:

Nada como entender como funciona e saber o que se está a fazer.

apesar de não ter feito conforme @Ivo Vicentepropos, foi a luz que me ajudou, o meu muito obrigado.

Assim que possa deixo aqui o código a funcionar.

Ainda bem que serviu para orientar, nem todo o código ou lógica é feita de mesma maneira importa entender e deixar a funcionar :-)

É continuar a programar, para melhorar.

Feito é melhor que perfeito

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.