John Hebert Trindade Posted October 19, 2021 at 02:24 PM Report Share #624220 Posted October 19, 2021 at 02:24 PM 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 More sharing options...
Ivo Vicente Posted October 19, 2021 at 09:22 PM Report Share #624230 Posted October 19, 2021 at 09:22 PM (edited) 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(); 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 October 19, 2021 at 09:23 PM by Ivo Vicente Feito é melhor que perfeito Link to comment Share on other sites More sharing options...
John Hebert Trindade Posted October 19, 2021 at 11:19 PM Author Report Share #624231 Posted October 19, 2021 at 11:19 PM (edited) 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 October 19, 2021 at 11:20 PM by John Hebert Trindade Link to comment Share on other sites More sharing options...
John Hebert Trindade Posted October 19, 2021 at 11:21 PM Author Report Share #624232 Posted October 19, 2021 at 11:21 PM Por favor ajude me se puder Link to comment Share on other sites More sharing options...
Cerzedelo Posted October 20, 2021 at 09:11 AM Report Share #624237 Posted October 20, 2021 at 09:11 AM 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. 1 Report Link to comment Share on other sites More sharing options...
John Hebert Trindade Posted October 22, 2021 at 08:52 PM Author Report Share #624317 Posted October 22, 2021 at 08:52 PM Eu consigo fazer a marca d’água ou fazer o upload o único problema é que preciso fazer em várias fotos ao mesmo tempo. E juntar os dois código é que não estou a consegui. Link to comment Share on other sites More sharing options...
Solution Ivo Vicente Posted October 22, 2021 at 09:41 PM Solution Report Share #624318 Posted October 22, 2021 at 09:41 PM (edited) 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 October 22, 2021 at 09:41 PM by Ivo Vicente Feito é melhor que perfeito Link to comment Share on other sites More sharing options...
John Hebert Trindade Posted October 23, 2021 at 08:56 AM Author Report Share #624319 Posted October 23, 2021 at 08:56 AM (edited) 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 October 23, 2021 at 09:32 AM by John Hebert Trindade Link to comment Share on other sites More sharing options...
John Hebert Trindade Posted October 25, 2021 at 07:26 AM Author Report Share #624324 Posted October 25, 2021 at 07:26 AM 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. Link to comment Share on other sites More sharing options...
Ivo Vicente Posted November 2, 2021 at 09:19 PM Report Share #624415 Posted November 2, 2021 at 09:19 PM 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now