Canvas: nova classe para manipulação e redimensionamento de imagens com PHP
Quase 3 anos, 144 comentários e dezenas de e-mails depois resolvi atualizar e dar o devido valor à minha classe de manipulação e redimensionamento de imagens com PHP. A antiga m2brimagem agora virou canvas e, em breve, contará com um site próprio.
Nessa nova versão, dei uma revisada geral no código e adicionei novas funcionalidades.
A primeira grande mudança foi o nome: m2brimagem não era lá muito amigável. Além disso, chega de receber e-mails na agência (m2brnet) solicitando suporte e ajuda com a classe. O nome ainda não é final, então, caso você tenha alguma ideia bacana deixa-a registrada nos comentários lá em baixo.
Agora falando da parte técnica, a classe canvas apresenta as seguintes novas funcionalidades:
- Encadear métodos
- Carregar imagens sem extensão de imagens
- Carregar imagens diretamente de um formulário, utilizando apenas o arquivo temporário do PHP
- Carregar imagens externas, via URL (vai depender do seu servidor)
- Criar uma nova imagem "vazia", apenas com cor de preenchimento
- Adicionar legendas com posições fixas, assim como já acontecia com marcas d'água (topo_centro, baixo_esquerda etc.)
- Adicionar cor de fundo nas legendas
- Adicionar/configurar cores passando como parâmetro um valor hexadecimal
Pra quem quiser testar
Segue o link para download do arquivo fonte. Lembrando que não garanto o funcionamento completo, então evite usar em sistemas em produção.
Novos exemplos de uso
Todos os exemplos deste artigo utilizam a chamada da classe. Pra evetir repetição no texto, vou mostrar apenas uma vez aqui:
require_once( 'canvas.php' ); $img = new canvas();
Continua sendo válido carregar imagens no próprio construtor:
$img = new canvas( 'imagem.jpg' );
Carregar e redimensionar, utilizando o método preenchimento
$img->carrega( 'cats.jpg' ) ->hexa( '#FF005C' ) ->redimensiona( 400, 200, 'preenchimento' ) ->grava();
Notem a utilização do encadeamento de métodos, tornando o código muito mais elegante e legível. O método redimensiona, que antes recebia o tipo como string, agora recebe este parâmetro na forma de constantes. 'fill' passou a ser 'preenchimento'. O tipo padrão ainda é o redimensionamento simples, distorcendo caso sejam passados ambos largura e altura.
Quando só é passado um valor, altura ou largura, a classe calcula automaticamente o valor ausente na proporção. E, pra finalizar, também é possível redimensionar por porcentagem, bastando acrescentar o símbolo % nas dimensões.
Criar uma imagem nova
$img->hexa( '#ff0000' ) ->novaImagem( 300, 300 ) ->hexa( '#fff' ) ->legenda( 'FLAMENGO', 20, 'meio', 'centro', '#000', true, 'Aller_Bd.ttf' ) ->grava();
Este novo método permite a criação de uma nova imagem "do zero". Você passa uma cor de fundo através dos métodos hexa ou rgb e utiliza a função novaImagem com os parâmetros largura e altura. No exemplo também adiciono um texto no centro da imagem - mais abaixo falo das novidades do método legenda.
Carregar imagem utilizando uma URL
$img->carregaUrl( 'http://www.google.com.br/intl/en_com/images/srpr/logo1w.png' ) ->redimensiona( 200, 100, 'crop' ) ->grava();
Muita gente pediu isso via comentários ou e-mail, então decidi implementar, mesmo sendo um pouco contra. :) As funções de criação de imagem do php/gd já permitem por natureza carregar um endereço externo (imagecreatefromjpeg, imagecreatefrompng etc.), no entanto, por questões de segurança, seu servidor provavelmente vai ter desabilitado este acesso (como no caso aqui do mediatemple).
Ainda aconselho desenvolver uma outra função para salvar imagens externas e carregar a imagem normalmente na classe canvas.
Legendas com posição fixa (experimental)
$img->carrega( 'cats.jpg' ) ->redimensiona( 400, 400, 'crop' ) ->hexa( '#000' ) ->legenda( 'LOL Catz!', 20, 'meio', 'centro', '#FF005C', true, 'Aller_Bd.ttf' ) ->grava();
O método marcaFixa, de autoria do leitor Giolvani, fez grande sucesso. A ideia foi duplicada para as legendas. Agora, também é possível passar as posições topo, meio e baixo - esquerda, centro e direita nas coordenadas X e Y da legenda. Ainda não está funcionando 100%, eu acho, principalmente com fontes truetype. A função marcaFixa, aliás, passou a ser private e agora é chamada na própria marca() - basta passar os parâmetros X e Y como strings.
Outra novidade nas legendas é a possibilidade de adicionar uma cor de fundo. É o quinto parâmetro do método legenda(), podendo ser uma cor hexadecimal como string ou um array com as cores RGB. Aliás, tô achando que o legenda() está com muitos parâmetros. Talvez seja melhor separar em legenda normal e truetype, o que acham?
Filtros
Pesquisando por métodos de blur, de conversão para preto e branco etc. acabei descobrindo a função nativa imagefilter() - é curioso como sempre tem alguma coisa nova no PHP pra descobrir.
O método recebe como parâmetro, além do tipo de filtro, a quantidade de vezes que ele será aplicado. Algumas opções de filtragem possuem parâmetros extras. Aqui segui o padrão da função original: arg1, arg2, arg3 e arg4. Mais detalhes no manual da imagefilter().
| canvas | imagefilter() | Descrição |
|---|---|---|
| blur | IMG_FILTER_GAUSSIAN_BLUR | "Embaça" a imagem, com desenfoque gaussiano. |
| blur2 | IMG_FILTER_SELECTIVE_BLUR | "Embaça" a imagem, com desenfoque seletivo. |
| brilho | IMG_FILTER_BRIGHTNESS | Altera o brilho da imagem, definido através do parâmetro arg1. |
| cinzas | IMG_FILTER_GRAYSCALE | Converte a imagem para tons de cinza. |
| contraste | IMG_FILTER_CONTRAST | Altera o contraste da imagem, definido através do parâmetro arg1 |
| colorir | IMG_FILTER_COLORIZE | Converte a imagem para tons da cor especificada. Arg1, arg2 e arg3 corrspondem às cores R, G e B - e o arg4 é o canal alfa. |
| edge | IMG_FILTER_EDGEDETECT | Destaca os traços da imagem. |
| emboss | IMG_FILTER_EMBOSS | "Acimenta" (ugh) a imagem. |
| negativo | IMG_FILTER_NEGATE | Inverte todas as cores da imagem. |
| pixel | IMG_FILTER_PIXELATE | Pixeliza a imagem. Arg1 é o tamanho do bloco (pixel) e arg2 é o modo de pixelização (avançado - true, ou normal - false). só funciona com PHP 5.3 ou superior |
| ruido | IMG_FILTER_MEAN_REMOVAL | Adiciona ruído, aplicando um efeito do tipo rascunho. |
| suave | IMG_FILTER_SMOOTH | Suaviza a imagem conforme o valor especificado em arg1. |
Confira alguns exemplos:
Blur
$img->carrega( 'cats.jpg' ) ->redimensiona( '50%' ) ->filtra( 'blur', 20 ) ->grava();
Cor
$img->carrega( 'cats.jpg' ) ->redimensiona( '50%' ) ->filtra( 'colorir', 1, 255, 0, 92, 60 ) ->grava();
Negativo
$img->carrega( 'cats.jpg' ) ->redimensiona( '50%' ) ->filtra( 'negativo', 2, 4 ) ->grava();
Emboss
$img->carrega( 'cats.jpg' ) ->redimensiona( '50%' ) ->filtra( 'emboss' ) ->grava();
Ruído
$img->carrega( 'cats.jpg' ) ->redimensiona( '50%' ) ->filtra( 'ruido', 2 ) ->grava();
Exemplo combinando várias opções da classe canvas
$img->carrega( 'cats.jpg' ) ->redimensiona( '40%', '', 'crop' ) ->filtra( 'colorir', 1, 255, 70, 60, 40 ) ->flip() ->hexa( '#fff' ) ->gira( 45 ) ->filtra( 'ruido', 1, 3 ) ->marca( 'marca.png', 'topo', 'esquerda' ) ->legenda( 'Criado automaticamente em '. date( 'd/m/Y H:i:s' ), 5, 'baixo', 'direita', '#000' ) ->legenda( 'Lol Catz!', 20, 'topo', 'direita', '#ff9900', true, 'Aller_Bd.ttf' ) ->grava();
Participando
Fique a vontade para, utilizando os comentários, sugerir melhorias e novas funcionalidades. Antes de indicar qualquer erro, verifique os seguintes problemas abaixo:
- seu servidor está configurado com PHP 4 e a classe requer PHP 5;
- a extensão GD não está habilitada no seu servidor;
- o diretório no qual você está tentando salvar as imagens não possui permissão de escrita;
- no caso de retornar as imagens direto na tela, o script está retornando alguma coisa antes da imagem, um texto, um código perdido - o que não pode acontecer;
- o PHP do seu servidor não foi compilado com freetype (para o uso de fontes truetype) ou com suporte à função imagefilter();
- o formulário que envia a imagem, sendo esse o caso, está sem o enctype="multipart/form-data".
Espero que curtam e que divirtam-se utilizando esta classe da mesma forma que foi divertido para mim desenvolvê-la.
147 comentários.
Mauro escreveu:
Uma boa seria colocar a classe no github para mais pessoas poderem contribuir.
Responder
Davi Ferreira escreveu:
Nunca usei o github, tava pensando em deixar no google code mesmo, acho que rola SVN lá. Se quiser me ajudar ou manter a classe lá no github vai ser bem-vindo :)
Responder
Davi Ferreira escreveu:
Publiquei lá: http://github.com/daviferreira/canvas
Responder
Vedovelli escreveu:
Sábia decisão colocar no GitHub. As pessoas podem criar uma cópia separada do seu código, melhorar e submeter à sua aprovação. Se achar legal, faz um merge! Abração!!
Responder
Alberto escreveu:
Muito bom Davi, como eu faço pra gravar em uma pasta ? ->grava( 'imagens/' ); ? Abraço
Responder
Vinicius Almeida escreveu:
Opa, mais uma excelente classe! Eu ia usar a outra, mas essa nova ficou realmente excelente! Como dica, na minha opinião, poderia ser implementada a criação do diretório caso ele não exista, na função grava(). Ficaria mais ou menos assim:
// valida diretório if ( !is_dir( $dir_destino ) ) { if ( !mkdir( $dir_destino ) ) { trigger_error( 'Não foi possível Criar ou Localizar o Diretório de destino', E_USER_ERROR ); } }Parabéns e, precisando de ajuda com o projeto, pode contar comigo! ^^Responder
Paulo Mauricio escreveu:
Olá Davi, parabens pela classe, eu sou novo na area php, e gostaria de saber se posso copiar uma foto com a marca dgua para o upload abaixo? aguardo abraços move_uploaded_file($_FILES['upload_imagem']['tmp_name'],"../imagens/".$imagem_final);
Responder
Leandro Correa dos Santos escreveu:
Excelente! Vou usar aqui na agência! Parabéns!
Responder
Fernando Souza escreveu:
Olá Davi, primeiramente parabéns pelo blog e pela classe de qualidade e brasileira... queria saber se é possível redimensionar uma imagem proporcional tanto horizontal como vertical... deixa eu explicar mellhor... Por exemplo: ->redimensiona( 400, 300 ) se a imagem for horizontal para ela ficar no maximo 400 px de largura e maximo de 300 de altura, mais sem amassar a foto. se a imagem for vertical para ela ficar no maximo 300 px de largura e maximo de 400 de altura, proporcional. não sei se consegui me expressar direito... muito obrigado desde já!
Responder
Davi Ferreira escreveu:
Fala Fernando! Cara, você tem que fazer essa validação antes de mandar redimensionar, e aí utilizar o método de acordo com o tamanho da imagem. Uma dica é utilizar a função getimagesize() do PHP, dá uma olhada no manual. Vê aí se consegue implementar, qualquer coisa me fala.
Responder
Fernando escreveu:
Olá Davi, eu fiz desta forma, não sei se é a melhor mais deu certo... obrigado.
list($w, $h, $type, $attr) = getimagesize($tmp_name); if($w > $h){ $x = 640; } else { $x = 480; } $img = new canvas(); $img->carrega($tmp_name); $img->redimensiona($x, '', ''); $img->grava($uploadfile);Responder
Cezar Luiz escreveu:
É melhor usar o operador ternário, como você seta apenas a variável $x, é mais simples e tem melhor desempenho, fica assim:
$x = ($w > $h) ? 640 : 480;
Abraço.
Responder
Tales Santos escreveu:
Olá Davi, tdo bem? Ainda não utilizei a classe mas parece ser mto boa mesmo. Uma sugestão que daria seria escrever a classe em inglês. Assim os programadores gringos poderão entender melhor a sua classe e facilitaria d divulgacão da mesma. Se quiser ajuda, estou à disposicão. Abracos.
Responder
Ricardo escreveu:
Olá Davi, antes de tirar uma dúvida quero agradecer pela iniciativa do seu blog e pela canvas que achei excelente. Tem como redimensionar uma galeria interia dentro de um loop, tentei mas não conseguim tens alguma dica?
Responder
Brayan escreveu:
Olá, cara parabéns pelo trabalho, muito bacana a classe :D Você já utilizou a classe wideImage? qual sua opinião sobre ela? vlws
Responder
Davi Ferreira escreveu:
Fala Brayan, não conheço não, cara, vou dar uma pesquisada. É legal? Mesmo objetivo? Valeu!
Responder
Ivan Júnior escreveu:
Cara to tendo um probleminha pra dar resizer em imagem via URL.. tipo n utilizar imagem hospedada no host... tem como ?
Responder
Davi Ferreira escreveu:
Fala, Ivan. Tem um exemplo no próprio texto:
$img->carregaUrl( 'http://www.google.com.br/intl/en_com/images/srpr/logo1w.png' ) ->redimensiona( 200, 100, 'crop' ) ->grava();Não é isso? Vai depender da configuração do seu servidor, pra acessar arquivos remotos.Responder
Renato Tarantelli escreveu:
Olá Davi,
Mesmo com a configurações do servidor desabilitadas não consigo gravar a imagem em um diretório qualquer.
Tem ideia do que possa ser?
PS.: Parabéns pelo trabalho :-)
Responder
Ferrugis escreveu:
ja verificou permissões de pasta?
Responder
Fernando Souza escreveu:
Olá Davi, estou passando por aqui novamente, desta vez somente para agradecer pela ótima classe, com certeza não quebra um galho e sim uma arvore inteira... valew obrigado
Responder
Eduardo Matos escreveu:
passei o olho pela classe e vi alguns locais que podem melhorar um pouquinho (só um refactoring básico)... Quando eu tiver tempo modifico e dou um commit. Uma dúvida: por que a classe está escrita em portugues? um tempo atrás ouvi um podcast gringo onde um dos participantes comentou que encontrou uma classe bem legal pro que ele queria, mas quando foi abrir o código fonte viu que estava tudo em alemão! :S Acho que escrever em inglês significa internacionalizar o código, o que acredito ser uma boa ideia. Mas isso é só uma opinião pessoal. Abraços
Responder
Davi Ferreira escreveu:
Fala, Eduardo! Antes a classe era em inglês, resolvi mudar pra dar uma força pros brasileiros, já que lá fora tem muita opção de classe desse tipo, eu acho. Meu objetivo é melhorar a base de código nacional mesmo, já que, infelizmente, muita gente ainda não entende/domina inglês. Valeu!
Responder
Giolvani escreveu:
Show Dani! Voltei a usar sua classe, ta muito bom cara, parabéns...
Responder
Davidson Ferreira escreveu:
Parabens pela classe Davi, somos quase xarás! Estou utilizando para redimensionar passando nome da imagem no src da tag img Acontece q caiu muito a perfórmace dessa forma. Seria a melhor maneira de utlizar ou vc mê sugeri outra? No aguardo
Responder
Davi Ferreira escreveu:
Fala, xará :) Certamente não é a melhor forma. Dependendo do número de imagens e do tamanho das imagens vai afetar bastante a performance. O melhor é fazer antes mesmo, gerar um novo tamanho e salvar a imagem pra uso posterior. Valeu!
Responder
Davidson Ferreira escreveu:
Obrigado pela dica e agilidade na resposta xará! Valew
Responder
jose pedro escreveu:
cara meus parabéns pela classe, ótima, to estudando aqui, gostei muito dela ser em português, pois dá pra gente entender melhor o código. me diz uma coisa dá para utilizá-la pra criar carteirinhas, estou tentando aki só tô tendo problemas com o as coordenadas x e y da legenda. meu objetivo é usar ela junto com um banco que estou bolando aki. Cara de verdade você quebrou um galhão, me deu uma direção. A classe WideImage é muito boa, mas é muito complexa, a sua é uma verdadeira mão na roda, recomendo que vc dê uma olhada nela (WideImage).
Responder
Van Neves escreveu:
Ae Davi, arrebentou dessa vez, show de bola mesmo! Parabéns!
Responder
Danilo Luiz escreveu:
Parabéns Meu caro amigo, muito bom o conteúdo do seu site e principalmente essa classe f.o.d.a .. abraços
Responder
Jackson escreveu:
Muito bom o artigo! onde baixo o arquivo canvas.php? Abraço.
Responder
Davi Ferreira escreveu:
Fala, Jackson! Você consegue baixar aqui: http://github.com/daviferreira/canvas
Responder
Jackson escreveu:
Fala Davi, Obrigado pelo retorno, consegui baixar a classe canvas.php Coloquei os arquivos na mesma pasta e aparece a msg: Fatal error: Erro: Arquivo de imagem não encontrado! in C:\AppServ\www\fitness\new\modulos\fotos\canvas.php on line 87 O que pode ser? Obrigado, Abraço.
Responder
Jackson escreveu:
Davi, Consegui carregar a imagem, mas ao exibir no navegador aparece o erro: Warning: Cannot modify header information - headers already sent by (output started at referente a linha da classe: header( "Content-type: image/png" ); imagepng( $this->img ); imagedestroy( $this->img ); exit;
Responder
Davi Ferreira escreveu:
Oi, Jackson, tem alguma coisa dando saída no script antes da imagem. No caso da imagem ser exibida direto no navegador, não pode ter nenhuma saída antes dela (texto, HTML etc.).
Responder
Eduardo Matos escreveu:
Você pode habilitar o output buffer. Se ele tiver ligado você pode usar a função 'header' em qualquer parte do seu script. A maneira mais simples que eu conheço de liga-lo é usar a função ob_start, mas você tem de usa-la antes que qualquer coisa seja jogada pro navegador.
Responder
Jackson escreveu:
Caros amigos, Obrigado pela ajuda, não tinha textos e html pois estava apenas testando a classe canvas e estava usando somente o script de exemplo. Usei a função ob_start e funcionou. Agradeço o auxílio e agilidade! Parabéns pelo ótimo trabalho! Abraço.
Responder
André escreveu:
Olá Davi, estou tentando aplicar a canvas, eu consigo fazer o resize da imagem mas a exibição do site "termina" na imagem. no caso de uma listagem de produtos, a pagina para na primeira exibição da imagem redimensionada e para. alguma sugestão ? obrigado
Responder
Jackson escreveu:
Só mais uma dúvida... Quando utilizo dessa forma funciona: ->legenda( 'Lol Catz!', 20, 'topo', 'direita', '#ff9900') Quando utilizo dessa forma não funciona: ->legenda( 'Lol Catz!', 20, 'topo', 'direita', '#ff9900', true, 'Aller_Bd.ttf' ) Aparece esses erros: Warning: imagettfbbox() [function.imagettfbbox]: Invalid font filename... Warning: imagecreatetruecolor() [function.imagecreatetruecolor]: Invalid image dimensions... Warning: imagecolorallocate(): supplied argument is not a valid Image resource... Warning: imagefill(): supplied argument is not a valid Image resource... Warning: imagecopy(): supplied argument is not a valid Image resource... A biblioteca GD e Freetype estão habilitadas. O que pode ser? Obrigado. Abraço.
Responder
Edson Dota escreveu:
Gostaria saber se existe um método para redimensionar a imagem a partir de duas coordenadas. Parabéns pelo blog! []'s
Responder
Thalis Vilela escreveu:
Quando eu tento utilizar uma imagem diretamente do formulário: $img->carrega($_FILES['imagem']['tmp_name']); na hora de gravar, dá o seguinte erro: Undefined index: extension in C:\wamp\www\*****\class\canvas.php on line 899 imagino que seja pq o arquivo tmp não tem uma extensão válida, como fazer funcionar?
Responder
Matheus escreveu:
Mto boa a classe, está de parabens.. vi um comentario acima e tambem adoraria a resposta dele.. "Gostaria saber se existe um método para redimensionar a imagem a partir de duas coordenadas. Parabéns pelo blog!" i ai, tem como?! vlw
Responder
Matheus escreveu:
Outra dúvida, tem como fazer a marca d'agua repetir? como o background no html, q da pra colocar uma img de 3x3px q ela cobre o fundo todo. tem como fazer isso com a marca d'agua? obrigado mais uma vez.
Responder
Bruno escreveu:
Essa classe só é compatível HTML 5? Estou perguntando pelo nome da mesma "canvas" dar-se-á entender que a mesma utiliza a tag canvas do HTML 5... estou certo?
Responder
Adriano escreveu:
Nao estou sabendo adicionar marca daguar nesse codigo
<?php //----------------------------------------- start edit here ---------------------------------------------// $script_location = "http://www.spektros.com.br/upload/"; // location fo the script $maxlimit = 9048576; // maxim image limit $folder = "images"; // folder where to save images // requirements $minwidth = 100; // minim width $minheight = 100; // minim height $maxwidth = 2560; // maxim width $maxheight = 1920; // maxim height // allowed extensions $extensions = array('.png', '.gif', '.jpg', '.jpeg','.PNG', '.GIF', '.JPG', '.JPEG'); //----------------------------------------- end edit here ---------------------------------------------// // check that we have a file if((!empty($_FILES["uploadfile"])) && ($_FILES['uploadfile']['error'] == 0)) { // check extension $extension = strrchr($_FILES['uploadfile']['name'], '.'); if (!in_array($extension, $extensions)) { echo 'wrong file format, alowed only .png , .gif, .jpg, .jpeg <script language="javascript" type="text/javascript">window.top.window.formEnable();</script>'; } else { // get file size $filesize = $_FILES['uploadfile']['size']; // check filesize if($filesize > $maxlimit){ echo "File size is too big."; } else if($filesize < 1){ echo "File size is empty."; } else { // temporary file $uploadedfile = $_FILES['uploadfile']['tmp_name']; // capture the original size of the uploaded image list($width,$height) = getimagesize($uploadedfile); // check if image size is lower if($width < $minwidth || $height < $minheight){ echo 'Image is to small. Required minimum '.$minwidth.'x'.$minheight.' <script language="javascript" type="text/javascript">window.top.window.formEnable();</script>'; } else if($width > $maxwidth || $height > $maxheight){ echo 'Image is to big. Required maximum '.$maxwidth.'x'.$maxheight.' <script language="javascript" type="text/javascript">window.top.window.formEnable();</script>'; } else { // all characters lowercase $filename = strtolower($_FILES['uploadfile']['name']); // replace all spaces with _ $filename = preg_replace('/\s/', '_', $filename); // extract filename and extension $pos = strrpos($filename, '.'); $basename = substr($filename, 0, $pos); $ext = substr($filename, $pos+1); // get random number $rand = time(); // image name $image = $basename .'-'. $rand . "." . $ext; // check if file exists $check = $folder . '/' . $image; if (file_exists($check)) { echo 'Image already exists'; } else { // check if it's animate gif $frames = exec("identify -format '%n' ". $uploadedfile .""); if ($frames > 1) { // yes it's animate image // copy original image copy($_FILES['uploadfile']['tmp_name'], $folder . '/' . $image); // orignal image location $write_image = $folder . '/' . $image; //ennable form echo '<img src="' . $write_image . '" alt="'. $image .'" alt="'. $image .'" width="500" /><br /> <input type="text" name="location" value="[IMG]'.$script_location.''.$write_image.'[/IMG]" class="location corners" /> <script language="javascript" type="text/javascript">window.top.window.formEnable();</script>'; } else { // create an image from it so we can do the resize switch($ext){ case "gif": $src = imagecreatefromgif($uploadedfile); break; case "jpg": $src = imagecreatefromjpeg($uploadedfile); break; case "jpeg": $src = imagecreatefromjpeg($uploadedfile); break; case "png": $src = imagecreatefrompng($uploadedfile); break; } // copy original image copy($_FILES['uploadfile']['tmp_name'], $folder . '/' . $image); // orignal image location $write_image = $folder . '/' . $image; // create first thumbnail image - resize original to 80 width x 80 height pixels $newheight = ($height/$width)*80; $newwidth = 80; $tmp=imagecreatetruecolor($newwidth,$newheight); imagealphablending($tmp, false); imagesavealpha($tmp,true); $transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127); imagefilledrectangle($tmp, 0, 0, $newwidth, $newheight, $transparent); imagecopyresampled($tmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height); // write thumbnail to disk $write_thumbimage = $folder .'/thumb-'. $image; switch($ext){ case "gif": imagegif($tmp,$write_thumbimage); break; case "jpg": imagejpeg($tmp,$write_thumbimage,100); break; case "jpeg": imagejpeg($tmp,$write_thumbimage,100); break; case "png": imagepng($tmp,$write_thumbimage); break; } // create second thumbnail image - resize original to 125 width x 125 height pixels $newheight = ($height/$width)*125; $newwidth = 125; $tmp=imagecreatetruecolor($newwidth,$newheight); imagealphablending($tmp, false); imagesavealpha($tmp,true); $transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127); imagefilledrectangle($tmp, 0, 0, $newwidth, $newheight, $transparent); imagecopyresampled($tmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height); // write thumbnail to disk $write_thumb2image = $folder .'/thumb2-'. $image; switch($ext){ case "gif": imagegif($tmp,$write_thumb2image); break; case "jpg": imagejpeg($tmp,$write_thumb2image,100); break; case "jpeg": imagejpeg($tmp,$write_thumb2image,100); break; case "png": imagepng($tmp,$write_thumb2image); break; } // create third thumbnail image - resize original to 125 width x 125 height pixels $newheight = ($height/$width)*250; $newwidth = 250; $tmp=imagecreatetruecolor($newwidth,$newheight); imagealphablending($tmp, false); imagesavealpha($tmp,true); $transparent = imagecolorallocatealpha($tmp, 255, 255, 255, 127); imagefilledrectangle($tmp, 0, 0, $newwidth, $newheight, $transparent); imagecopyresampled($tmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height); // write thumbnail to disk $write_thumb3image = $folder .'/thumb3-'. $image; switch($ext){ case "gif": imagegif($tmp,$write_thumb3image); break; case "jpg": imagejpeg($tmp,$write_thumb3image,100); break; case "jpeg": imagejpeg($tmp,$write_thumb3image,100); break; case "png": imagepng($tmp,$write_thumb3image); break; } // all is done. clean temporary files imagedestroy($src); imagedestroy($tmp); // image preview echo "<img src='" . $write_thumbimage . "' alt='". $image ."' /><br /> <input type='text' name='location' value='[IMG]".$script_location."". $write_thumbimage ."[/IMG]' class='location corners' /><br /> <br /> <img src='" . $write_thumb2image . "' alt='". $image ."' /><br /> <input type='text' name='location' value='[IMG]".$script_location."". $write_thumb2image ."[/IMG]' class='location corners' /><br /> <br /> <img src='" . $write_thumb3image . "' alt='". $image ."' /><br /> <input type='text' name='location' value='[IMG]".$script_location."". $write_thumb3image ."[/IMG]' class='location corners' /><br /> <br /> <img src='" . $write_image . "' alt='". $image ."' alt='". $image ."' width='500' /><br /> <input type='text' name='location' value='[IMG]".$script_location."".$write_image."[/IMG]' class='location corners' /> <script language='javascript' type='text/javascript'>window.top.window.formEnable();</script> <div class='clear'></div>"; } } } } // database connection include('inc/db.inc.php'); // insert into mysql database and show success message mysql_query("INSERT INTO `image_upload` (`id`, `image`, `thumbnail`, `thumbnail2`, `thumbnail3` ) VALUES (NULL, '". $image ."', 'thumb-". $image ."', 'thumb2-". $image ."', 'thumb3-". $image ."')"); } // error all fileds must be filled } else { echo '<div class="wrong">You must to fill all fields!</div>'; } ?>Responder
Leonardo escreveu:
Olá Davi, Parabéns pelo trabalho. Uma ótima classe. Tenho só um probleminha que não estou conseguindo resolver. Eu fiz um crop de ima imagem .gif que tinha fundo transparente, mas na imagem 'cropada' o fundo ficou preto. Como posso fazer para manter o fundo transparente? Obrigado
Responder
Renato Muniz escreveu:
Olá Davi parabéns, veja bem tem algum tratamento de zoom nesta classe ou tem como utilizar outra classe. no meu caso gostaria de dá zoom e utilizar os efeitos do canvas ao mesmo tempo. agradeço desde já. me informe por favor. at+
Responder
Ramon Vicente escreveu:
Olá David, ótima classe mesmo, só tive um problema referente a uma funcionalidade que eu queria ( adicionar o canvas transparente numa imagem qualquer) resolvi assim : substitui isso:
private function preencheImagem() { $cor_fundo = imagecolorallocate( $this->img_temp, $this->rgb[0], $this->rgb[1], $this->rgb[2] ); imagefill( $this->img_temp, 0, 0, $cor_fundo ); } // fim preencheImagemPor isso:private function preencheImagem() { imagealphablending($this->img_temp, false); imagesavealpha($this->img_temp, true); $cor_fundo = imagecolorallocatealpha( $this->img_temp, $this->rgb[0], $this->rgb[1], $this->rgb[2], 100); imagefill( $this->img_temp, 0, 0, $cor_fundo ); } // fim preencheImagemCom isso consigo redimensionar uma imagem e adicionar o canvas transparente, Porém agora estou com outro problema, na hora de redimensionar uma imagem Horizontal (largura > autura) para um tamanho com a proporcao largura/altura > do que a original, ele centraliza e adiciona o canvas normalmente, mais quando a proporcao é menor, no caso ele teria que diminuir a autura tb, isso nao acontece e ele estoura a imagem. você já tinha verificado isso?? Att.: Ramon VicenteResponder
Ramon Vicente escreveu:
Testando e Testando aqui descobri o que ocorria quando eu redimensionava com preenchimento, na verdade não descobri o porque pois não sako muito bem da GD, mais verifiquei que no preenchimento, na hora q eu colocava uma altura maior ou iqual a largura ele fazia o crop da imagem, pois, bem fui lá no codigo e retirei o if q fazia essa validação: Subistitui isso
if ( $this->nova_largura >= $this->nova_altura ) { $dif_w = ( ( $this->largura * $this->nova_altura ) / $this->altura ); } else { $dif_h = ( ( $this->altura * $this->nova_largura ) / $this->largura ); }Por Somente Isso:$dif_h = ( ( $this->altura * $this->nova_largura ) / $this->largura );Ai agora está funcionando certim o preenchimento com fundo transparente, hehe tudo que eu sempre quis... Att.: Ramon Vicente da Cunha e SilvaResponder
Mateus Caldas Craveiro escreveu:
Nossa valeu! Estava procurando isso também! Já alterei meu código... PS: Deviam colocar essa modificação no canvas oficial!
Responder
Gilton Guma escreveu:
@Ramon Vicente: A sua solução não funcionou em alguns casos para mim, consegui resolver de uma outra forma que funcionou em vários testes que realizei. A mudança foi a seguinte: private function redimensionaPreenchimento(){ ... ... /** * Verifica altura e largura * Calculo corrigido por Leonardo */ /* //Original if ( $this->nova_largura >= $this->nova_altura ){ $dif_w = ( ( $this->largura * $this->nova_altura ) / $this->altura ); } else { $dif_h = ( ( $this->altura * $this->nova_largura ) / $this->largura ); } */ //--> Meu ajuste (Ate agora funcionou, UFA!!!) if (($this->largura / $this->nova_largura) > ($this->altura / $this->nova_altura)){ $fator = $this->largura / $this->nova_largura; } else { $fator = $this->altura / $this->nova_altura; } $dif_w = $this->largura / $fator; $dif_h = $this->altura / $fator; //--> Meu ajuste - FIM ... Enfim, achei interessante compartilhar o ajuste para a galera, afim a união faz a força! :)
Responder
Anderson Batata escreveu:
Cara estava procurando um script com funcionalidades assim para utilizar em meu blog. Valeu cara! E continue assim com esse conteúdo!
Responder
Cleyton Ferrari escreveu:
Olá, muito legal a sua classe, eu tenho uma aqui que fui adaptando ao longo do tempo, e tem me servido bem, porem ao processar muitas imagens ao mesmo tempo, tipo para gerar uma cache de 30 imagens, ela demora. você pode/sabe me dizer se o GD é lento mesmo, ou pode ser a classe?
Responder
Leonardo escreveu:
Olá Davi, Parabéns pelo trabalho. Uma ótima classe. Tenho só um probleminha que não estou conseguindo resolver. Eu fiz um crop de ima imagem .gif que tinha fundo transparente, mas na imagem 'cropada' o fundo ficou preto. Como posso fazer para manter o fundo transparente? Obrigado
Responder
Ricardo escreveu:
Fala Davi, Muito boa sua classe porém eu tenho uma dúvida, quando utilizo alguma imagem png com fundo transparente ela fica preenchida de branco, você saberia me dizer como faço para deixar ela com o fundo transparente utilizando o crop? Vlw! Abs.
Responder
felipe gama gonzalez escreveu:
bom dia, tudo bom?? cara, parabens pelo blog, muito boa a classe!! por tentei de varias maneiras, mas nao consegui, quando coloco uma imagens pelo php, mas atraves do developertoolbox , a qualidade cai bastante, sabe me dizer se tem relacao??? e se da pra usar umas das funscoes pra melgorar?? tentei , mas nao consegui!! obrigado e feliz natal.
Responder
Dirceu escreveu:
Gostaria de saber se há alguma limitação na classe, no GD ou no php mesmo em relação a resolução de fotos, pois estou tentando redimensionar algumas imagens com resolução acima de 3 megapixels mas o script simplesmente para a execução. Obrigado.
Responder
Felipe escreveu:
Tem como eu usar sua classe em tempo que o usuario escolhe uma imagem para upload e qndo clicar em cadastrar ele fazer esse redimensionamento ?
Responder
Leonardo Cardoso escreveu:
Olá amigo Vi seu post sobre a classe e achei muito interessante, baixei para testar, porém, não esta funcionando. Estou tentando pegar uma imagem vinda de um formulário. $_POST["image"] Tem como eu pegar imaimagem desta maneira (vindo de um formulário) ou somente trabalhar em uma imagem já hospedada no servidor?
Responder
Diego Martins escreveu:
Fala, Davi! A classe é bem útil, porém estou encontrando um erro bem chato aqui. Após incluir o arquivo da classe, segue o código abaixo: $img = new canvas(); $img->carrega('cats.jpg')->redimensiona(207,58,'preenchimento')->grava(); E o erro: 'Não foi possível encontrar o arquivo.' O arquivo está no diretório correto. Uma outra pergunta: Para chamar arquivos que estão em outro diretório, posso passar a estrutura assim -> "pasta/pasta/arquivo" né? Valeu!
Responder
Diego Martins escreveu:
Davi, é impressão minha ou essa classe buga quando inserida em um contexto html? Estou tentando criar uma espécie de thumbs para uma lista de imagens e a página simplesmente não carrega, sendo mostrada apenas sua url no corpo da mesma. Abraços!
Responder
Felipe Duardo escreveu:
Bela Agilizada hein!!! agora queria saber se existe um metodo para por exemplo eu pegue uma imagem sem saber se ela esta com retrato ou paisagem.... e redimensionar pelo lado maior... ?!
Responder
Felipe Duardo escreveu:
Entao... quanto a minha duvida anterior.... adicionei um método, com base no antigo redimensionarRatio() mas acabei ficando com um problemão... tudo funcionou perfeitamente local! mas quando fiz o upload percebi que o metodo para carregar, pela url, e gerar imagens "on the fly", como voce disse.. não funciona na hospedagem da locaweb... ainda não tive tempo de testar em outro lugar... mas la não rolou o carregarUrl para um domonio de fora, para imagens no meu dominio funfou legal. passou por isso? sabe o que pode ser?! valew, e parabens pela colaboração!
Responder
Felipe Duardo escreveu:
a classe ta perfeita quanto ao carregamento pela url, eu que tava marcando com a marca d'agua, por isso não consegui gerar, falha minha... valew!!
Responder
Luan Rodrigues escreveu:
cara. tem como vc postar um exemplo da sua otima classe usando uma foto de um formulário? eu já tentei fazer isso funcionar e nao consegui. obrigado sua ajuda. parabens pela classe
Responder
Anderson Dadário escreveu:
Parabéns pelo script Davi e obrigado ao Ramon Vicente da Cunha e Silva pela colaboração com a transparência. Muito eficaz o trabalho de ambos hehe! Abraço
Responder
Possamai escreveu:
Olá! Muito bom essa classe. Em um projeto que estou desenvolvendo, utilizei a mesma e achei muito fácil trabalhar com ela. Parabéns mesmo. A única coisa que eu senti necessidade nesse projeto, foi com questão a importar uma imagem dentro da principal, passando posicionamento (não sei se existe uma função para isso). Então tomei a liberdade de acrescentar a seguinte função. Espero que contribua com alguém que precise: /** * Junta uma Imagem na principal * * @param $img, $posicao_x, $posicao_y * @return void */ public function juntarImagem( $imagem, $posicao_x = 0, $posicao_y = 0) { $arr_tamanhos = getimagesize( $imagem ); $w_original = $arr_tamanhos[0]; $h_original = $arr_tamanhos[1]; $img_tmp = imagecreatefromjpeg( $imagem ); imagecopy( $this->img, $img_tmp, $posicao_x, $posicao_y, 0, 0, $w_original, $h_original ); return $this; } // fim redimensiona()
Responder
Eduardo Martins escreveu:
Davi, sua classe sem dúvidas ajuda muita gente. Inclusive a mim. Mas eu tenho uma dúvida, na verdade duas. É possível com a sua classe eu dá um crop na imagem apartir de um ponto da imagem? Tipo, usando como referência o centro da imagem? É que usando o crop o corte que está fazendo é de baixo para cima, ou seja, quando passo o valor da altura. O corte acontece na parte superior da imagem. Outra dúvida é se é possível com a sua classe criar um novo arquivo apartir do arquivo tratado. Exemplo, um arquivo que tinha 600x400px ficou com 350x200 depois de ter passado pela classe e salvar esse arquivo com outro nome. Já agradeço a atenção Abraços
Responder
Everton escreveu:
como faço para a fonte truetype funcionar? estou colocando dentro do diretorio do site, coloquei true e o nome da fonte e não funcionou. Você pode me explicar como fazer o correto?
Responder
Everton escreveu:
já resolvi!!!
Responder
Yeremi Loli escreveu:
Opa... Estou tentando usar a classe mas sempre que aparecem assim na minha tela: r�e����@
Responder
Everton escreveu:
Tambem tive esse problema, então eu mudei o charset de todos os arquivos para inclusive o charset da classe cavas. Testa ai...
Responder
marcelo escreveu:
caro everton como vc fez isso?
tb estou com esse problema!!!
Responder
Leonardo escreveu:
Alguem sabe como ativar a opção de "SALVAR IMAGEM COMO" quando clica botão direito do mouse encima da imagem gerada ?... aqui aparece apenas thumbs.php ... pessoal fica perdido e não sabe que é apenas mudar o nome pra .jpg .... Valeu
Responder
rogerio escreveu:
estou adaptando para o CodeIgniter e estou com problemas para salvar a imagem A PHP Error was encountered Severity: Notice Message: Undefined index: extension Filename: libraries/Cavas.php Line Number: 889
Responder
Douglas de Menezes escreveu:
Não é pq o nome do arquivo está como "Cavas.php" e não "Canvas.php"?
Responder
Douglas de Menezes escreveu:
É só comigo, ou ela não manipula imagens grandes? Sempre dá erro de alocação. Eu pego uma imagem de 200kb de 2048x1080px ela dá erro, mas se eu pego uma de 500kb com uma resolução de 1280x720px ela carrega de boa. O.O ---- Quanto à lógica de redimensionar proprocionalmente, que algumas pessoas tiveram dificuldade, fiz da seguinte forma: $imagem->redimensiona($largura, '')->redimensiona('', $altura); assim ele mantém a proporção :D --- Alguém sabe algo sobre esse problema de alocação? O erro: Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 8192 bytes) in C:\Program Files\VertrigoServ\www\galeria\_system\canvas.php on line 208
Responder
Vitor Almeida escreveu:
Fala amigo, minha sugestão é você verificar o seguinte valor no seu php.ini: memory_limit Eu alterei aqui num dos servidores de teste que apresentava esse erro e resolvi !
Responder
Pablo escreveu:
Caso a solução do amigo não resolva, crie um arquivo php.ini na pasta do script que funcionará perfeitamente.
Responder
Rafael escreveu:
primeiro parabéns pelo tutorial, prfeito sua classe, mas queria saber a questão da classe quando coloco uma variável tipo: $fotos = "imagem.jpg"; $foto -> carrega('imagem/$fotos'); ele da como imagem não encontrada, mas quando coloco apenas o nome da imagem ele funfa legal..
Responder
Vaneves escreveu:
Hey Davi, essa versão tá bem legal, mas ainda não tem o redimensionamento proporcional que comentei no post antigo (mb2imagem). Precisei disso tive que caçar pra não ter que desenvolver novamente, mas é uma boa, muita gente precisa as vezes. Valeu, abraço.
Responder
nuno escreveu:
parabens pela class, muito boa, mas gostava de fazer uma pergunta ao fazer o redimensionamento com crop, nao e possivel fazer o crop ao centro da imagem? abraço.
Responder
Glaucio escreveu:
Parabéns pelo artigo, que encontrei buscando mais informações sobre manipulação de imagens com PHP. Gostaria de poder fazer Slices com uma imagem qualquer. Desta forma eu acrescentaria esta funcionalidade tornando desnecessário o uso de um programa de imagem, upload das "fatias" etc etc Seria possível implementar esta funcionalidade ? Abraço.
Responder
Leandro Diogenes escreveu:
Olá Davi. parabéns pela classe. muito show. estou precisando saber como poderia fazer para girar a marca. tentei adicionar no codigo mas ele perde a transparencia. alguem me ajuda ai. $cor_fundo = imagecolorallocate( $marcadagua, $this->rgb[0], $this->rgb[1], $this->rgb[2] ); $marcadagua = imagerotate( $marcadagua, 22, $cor_fundo ); imagealphablending( $marcadagua, true ); imagesavealpha( $marcadagua, true ); $marca_w = imagesx( $marcadagua ); $marca_h = imagesy( $marcadagua );
Responder
Leandro Diogenes escreveu:
ai galera achei a resposta para minha propria pergunta. basta adicionar -1 no paramentro de transparencia do rotate. ve so. $marcadagua = imagerotate( $marcadagua, 22,-1 );
Responder
Gusy escreveu:
DAVI ME AJUDA A MUDEI A VERSAO DO PHP PARA 5, MAS O ERRO PERSISTE. O ERRO É ESTE: Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in f:\inetpub\vhosts\dbrindes.com\httpdocs\PAINELADMIN\modulo\produtos\m2brimagem.class.php on line 15
Responder
Pablo escreveu:
Se você fechar corretamente a tag da Function } ou fechar o ; do seu include provavelmente funcione.
Responder
Giovani escreveu:
Não estou conseguindo baixar os exemplos e Canvas beta dá pau no link..
Responder
bruno escreveu:
OLÁ DAVID. PARABENS PELO SEU TRABALHO. AMIGO, SOU FOTOGRAFO E QUERIA LHE PEDIR UMA ORIENTAÇÃO. PRECISO DESENVOLVER UMA GALERIA EM MINIATURA DE MODO QUE O CLIENTE ARASTE AS FOTOS ESCOLHIDAS PARA UMA CAIXA E DEPOIS CHEGAR POR EMAIL PARA MIM. COMO FAZER ? EU USARIA O DRAG AND DROP JQUERY E MAIS OQUE ?
Responder
Pablo escreveu:
Você pode usar esse script aqui:
http://aquantum-demo.appspot.com/file-upload
Basta alterar para o que precisa, inclusive o redimensionamento.
Responder
Felipe Marques escreveu:
Olá Davi, Primeiramente meus parabéns, seu blog é excelente, muito bom mesmo!!!!! Se não fosse esse seu post eu estaria encrencado, auihauiahiuh. Seguinte utilizei sua classe e fiz uma adaptação nela, para poder acessar arquivos externos, devido ao problema que tivemos por utilizar imagens de outros servidores. Segue link do post que fiz mencionando o seu: http://www.felipemarques.com.br/2011/06/08/canvasremote-um-breve-update-na-famosa-classe-canvas/ Abraço!!!
Responder
Aluisio Martins Junior escreveu:
Putz Davi! Que show a sua classe cara, deixa a gente mal acostumado... Muuuuuuito boa mesmo! Tava aqui me matando para criar uma coisa beeeeeem mais simples e resolvi dar uma olhada no Google e te encontrei... "Very's good night's". Só tenho uma dúvida que é a seguinte, no parâmetro "->filtra( 'colorir', 1, 255, 0, 92, 60 )" do exemplo 5 dá um erro cabuloso "Warning: Wrong parameter count for imagefilter() in canvas.php on line 801" o que eu fiz pra resolver foi ir a sua classe que está "imagefilter( $this->img, IMG_FILTER_COLORIZE, $arg1, $arg2, $arg3, $arg4 );" e tirei a variável "$arg4", pois o imagefilter com IMG_FILTER_COLORIZE solicita apenas 5 parâmetros... Maaaaaas quero ver isto com vc se estou certo em retirar este parâmetro a mais ou vou bagunçar a classe? No mais meu amigo o que a tenho a dizer é que a classe é excelente. Abraços, Aluisio Martins Junior MJP Soluções
Responder
Fernando escreveu:
Seria interessante se o método grava() retornasse true ou false, assim dava pra validar se o arquivo foi gravado ou não.
Obrigado, ótima classe.
Responder
Silas Ribas escreveu:
Salve,
Tive problema com ela na geração de thumbnail de PNG com fundo transparente, ele colocava fundo preto. Seria legal não força o preenchimento do fundo quando for PNG.
Responder
marcio escreveu:
cara... ainda sou um completo noobie nestes lances de PHP... eu não sei como implementar estas coisas... alguem tem algum exemplo prático pra eu dar uma olhada... pode ser bem simples pra redimensionar ai eu dou meus passos :D
Responder
Isaias escreveu:
Perfeito!
Ótimo trabalho, me ajudo muito!!!
Abraço, Fique com Deus!
Responder
Cesimar Dias escreveu:
Perfeito! Não preciso falar mais nada. Rsrs
Responder
Miller escreveu:
Olá, muito boa tarde!
Eu preciso de ajuda.
Deu tudo certo pra mim, aqui funciona perfeitamente, mas só que uma imagem do meu computador de 80kb quando eu baixo pro meu computador de volta ele dobra o peso para 187kb.
Tem como a gente tirar um pouco da qualidade das imagens para que ela não fique tão pesada assim?
O código que eu uso eu resumi para esse:
<?php require( 'canvas.php' ); $img = new canvas(); $img->carrega( 'gg2.jpg' ) ->hexa( '#01821E' ) ->marca( 'aa2.png', 'baixo', 'direita' ) ->legenda( 'antonioalmeidanews', 9, 'baixo', 'direita', '#FFCB00', true, 'Aller_Bd.ttf' ) ->grava(); exit; ?>Por favor, me ajuda! Só falta eu resolver esse problema do peso das imagens.
Responder
Pablo escreveu:
Procura dentro da função as tags de criação da imagem por exemplo imgcreatejpg ou imagetojpg, no final provavelmente estára com 80 ou 90, ajuste pra qualidade que precisa.
Responder
Volverinejr escreveu:
também estava com esse mesmo problema
só precisa informar a qualidade da imagem no momento de salvar:
->grava($file, 80);
Responder
Miller escreveu:
Olá, muito boa tarde!
Eu preciso de ajuda.
Deu tudo certo pra mim, aqui funciona perfeitamente, mas só que uma imagem do meu computador de 80kb quando eu baixo pro meu computador de volta ele dobra o peso para 187kb.
Tem como a gente tirar um pouco da qualidade das imagens para que ela não fique tão pesada assim?
O código que eu uso eu resumi para esse:
<?php require( 'canvas.php' ); $img = new canvas(); $img->carrega( 'gg2.jpg' ) ->hexa( '#01821E' ) ->marca( 'aa2.png', 'baixo', 'direita' ) ->legenda( 'antonioalmeidanews', 9, 'baixo', 'direita', '#FFCB00', true, 'Aller_Bd.ttf' ) ->grava(); exit; ?>Por favor, me ajuda! Só falta eu resolver esse problema do peso das imagens.
Responder
volverinejr escreveu:
também estava com esse mesmo problema
só precisa informar a qualidade da imagem no momento de salvar:
->grava($file, 80);
Responder
Miller escreveu:
Opa! Pode ignorar esse meu comentário de cima, eu já conseguir resolver o problema do pedo das imagens.
Desculpem.
abraço!
Responder
_marcioBrandao escreveu:
Muito boa essa classe. Vou usar
Responder
Maicon Voltolini escreveu:
http://www.assemblysys.com/dataServices/php_roundedCorners.php
Com essa funcionalidade, a classe ficaria ainda mais irresistível!
Responder
marcelo escreveu:
caros, sobre o tamanho da fonte da legenda
no metodo
->legenda( 'LOL Catz!', 20, 'meio', 'centro', '#FF005C', true, 'Aller_Bd.ttf' )
->grava();
ja pus, em lugar do 20, varios outros valores e nao muda o tamanho da fonte. alguem poderia me ajudar com esse probl?
att
Responder
Davi Ferreira escreveu:
Fala, Marcelo!
Cara, aqui foi na boa todos os testes com o tamanho de fonte. Configura pra exibir erros e vê se não está retornando nada com relação a função imagettftext ou então permissão de acesso ao arquivo da fonte.
Responder
marcelo escreveu:
vlw man, mole meu aqui!! nao tinha erro nao. somente mais uma coisa, como passar a classe pra exibir legenda em utf-8? flw!
Responder
Hellen Cunha escreveu:
Olá Davi, excelente a sua classe, mas tenho uma dúvida, é possível utilizar em imagens que estão no banco de dados, se sim, como seria?
Responder
Davi Ferreira escreveu:
Por enquanto ainda não, Hellen :(
Mas se quiser adiciona a issue lá no Github ou então manda um pull request :D
www.github.com/daviferreira/canvas
Responder
Mayara escreveu:
Olá Davi, muito bom seus posts eu tenho uma dúvida eu tenho um site no Magento e queria mudar a URL do logo da minha loja e direciona-la para o site institucional como eu faço isso?
O meu código está assim:
<div class="header-container"> <div class="header"> <?php if ($this->getIsHomePage()):?> <h1 class="logo"> <strong><?php echo $this->getLogoAlt() ?></strong><a href="<?php echo $this->getUrl('') ?>" title="<?php echo $this->getLogoAlt() ?>" class="logo"><img src="<?php echo $this->getLogoSrc() ?>" alt="<?php echo $this->getLogoAlt() ?>"></a> </h1> <?php else:?><a href="<?php echo $this->getUrl('') ?>" title="<?php echo $this->getLogoAlt() ?>" class="logo"><strong><?php echo $this->getLogoAlt() ?></strong><img src="<?php echo $this->getLogoSrc() ?>" alt="<?php echo $this->getLogoAlt() ?>"></a> <?php endif?><h5 class="slogan"> <?php echo $this->__('best free magento theme') ?></h5> <p class="no-display"><a href="#main"><strong><?php echo $this->__('Skip to Main Content') ?> »</strong></a></p> <?php echo $this->getChildHtml('topSearch') ?> <div class="quick-access"> <p class="welcome-message"><?php echo $this->getWelcome() ?></p> <div class="shop-access"> <?php echo $this->getChildHtml('topLinks') ?> </div> </div> <?php echo $this->getChildHtml('store_language') ?> <?php echo $this->getChildHtml('headerCart') ?> </div> <?php echo $this->getChildHtml('topMenu') ?> </div>Desde já agradeço pela atenção!
Att.
Mayara Oliveira
Responder
Davi Ferreira escreveu:
Oi Mayara,
beleza?
Não sei se entendi direito, mas não seria só mudar o href direto no HTML?
Valeu!
Responder
Rodrigo Braga escreveu:
Muito Show sua classe cara!! Parabens! Sugestão de upgrade, round Corners, uso bastante! abraço!
Responder
Davi Ferreira escreveu:
Até coloquei uma issue lá no GitHub pra implementar os rounded corners, mas não sei se é realmente necessário. Hoje em dia dá pra fazer com CSS puro ou com JS.
Responder
Miller escreveu:
Olá Davi! Boa noite!
Eu só queria saber se tem como eu salva a imagem .jpg ao invés de .php .
Eu sei que é só alterar o nome imagem.php para imagem.jpg, mas meus clientes não sabem disso, são leigos.
E hoje eles reclamaram muito dizendo que não conseguem salvar as imagens.
Tem uma solução para isso?
Agradeço muito!
Responder
Davi Ferreira escreveu:
Oi, Miller.
A solução, eu acho, seria usar uma regra no htaccess, tipo:
RewriteRule ^imagem\.jpg$ imagem.php [NC,L]Responder
Miller escreveu:
Deu certo!
Para o pessoal que se deparou com o mesmo problema eu vou colocar aqui como eu resolvi o meu problema.
No .htaccess fiz assim:
RewriteRule ^(.*)$ 12.php?img=$1
No código html na chamada da imagem src fiz assim:
Estava assim:
src="12.php?img== $rs_linhas["foto1"] ?>"
Substitui por isso:
src="= $rs_linhas["foto1"] ?>"
Obrigado Davi.
Abraço a todos.
Responder
Odiar escreveu:
Primeiramente parabéns pelo trabalho.
Mas é o seguinte
não estou conseguindo fazer com que a foto seja enviada a um outro diretório
coloquei assim
$img->grava('uploads');
mas a imagem não vai para a pasta upload.
desde já agradeço;
Responder
Rafael - Fish escreveu:
Parabens cara!
salvou a minha vida! :D
Responder
Gilton Guma escreveu:
Desculpe o flood! :)
Favor considerar este ajuste para a função "show":
function show($name = NULL){
if(headers_sent()){
$this->error = "Headers already sent.";
return false;
}else{
header("Content-type: image/{$this->extension}");
if ($name) header("Content-Disposition:; filename=$name");
$this->output_image();
imagedestroy($this->image);
exit;
}
}
A chamada ficaria assim:
...->show("image.jpg");
OBS:
- Não sei se isso é correta, testado apenas no Chrome e IECA9.
Espero ter ajudado! ;)
Responder
Davi Ferreira escreveu:
Fala Guma!
Beleza?
Cara, faz um fork e depois manda um pull request lá no GitHub please? :)
github.com/daviferreira/canvas2
Valeu!
Responder
Diogo Queiroz escreveu:
Olá David, primeiramente parabenizo-o pelo grande trabalho ao desenvolver esta ferramenta e publicá-la na internet para uso comum de todos. Estou com problemas com imagens PNG que têm o fundo transparente, pois ao redimensioná-las, elas ficam com o fundo preto. Já tentei colocar uma cor de fundo que eu desejo utilizando a função hexa() mas não obtive sucesso, continua preto. Teria alguma solução para este problema?
Desde já obrigado.
Responder
Romero Araujo escreveu:
Alex consegui solucionar esse erro, agora eu errei e postei a resposta no item abaixo :)
Responder
Alex cota escreveu:
quando tenho um cache acima de 18 itens ele me retorna essa mensagem
Maximum number of allowable file uploads has been exceeded in Unknown on line 0
Responder
Romero Araújo escreveu:
Alex,
eu estava com esse mesmo problema, consegui resolver alterando os códigos abaixo:
inserir o código em negrito
private function redimensionaSimples() {
// cria imagem de destino temporária
$this->img_temp = imagecreatetruecolor( $this->nova_largura, $this->nova_altura );
$isTrueColor = imageistruecolor($this->img_temp);
if ( $isTrueColor) {
imagealphablending($this->img_temp, false);
imagesavealpha ( $this->img_temp , true );
}else{
imagealphablending( $this->img_temp, false );
$transparent = imagecolorallocatealpha( $this->img_temp, 0, 0, 0, 127 );
imagefill( $this->img_temp, 0, 0, $transparent );
imagesavealpha( $this->img_temp,true );
imagealphablending( $this->img_temp, true );
}
...
} // fim redimensiona()
private function redimensionaPreenchimento() {
...
// copia com o novo tamanho, centralizando
$dif_x = ( $dif_x - $dif_w ) / 2;
$dif_y = ( $dif_y - $dif_h ) / 2;
$isTrueColor = imageistruecolor($this->img_temp);
if ( $isTrueColor) {
imagealphablending($this->img_temp, false);
imagesavealpha ( $this->img_temp , true );
}else{
imagealphablending( $this->img_temp, false );
$transparent = imagecolorallocatealpha( $this->img_temp, 0, 0, 0, 127 );
imagefill( $this->img_temp, 0, 0, $transparent );
imagesavealpha( $this->img_temp,true );
imagealphablending( $this->img_temp, true );
}
...
}// fim redimensionaPreenchimento()
private function redimensionaCrop() {
...
// adiciona cor de fundo à nova imagem
$this->preencheImagem();
$isTrueColor = imageistruecolor($this->img_temp);
if ( $isTrueColor) {
imagealphablending($this->img_temp, false);
imagesavealpha ( $this->img_temp , true );
}else{
imagealphablending( $this->img_temp, false );
$transparent = imagecolorallocatealpha( $this->img_temp, 0, 0, 0, 127 );
imagefill( $this->img_temp, 0, 0, $transparent );
imagesavealpha( $this->img_temp,true );
imagealphablending( $this->img_temp, true );
}
...
} // fim redimensionaCrop
public function grava( $destino='', $qualidade = 100 ) {
...
case 'png':
$isTrueColor = imageistruecolor($this->img);
if ( $isTrueColor) {
imagealphablending($this->img, false);
imagesavealpha ( $this->img, true );
}else{
imagealphablending( $this->img, false );
$transparent = imagecolorallocatealpha( $this->img, 0, 0, 0, 127 );
imagefill( $this->img, 0, 0, $transparent );
imagesavealpha( $this->img,true );
imagealphablending( $this->img, true );
}
...
} // fim grava
Responder
Romero Araujo escreveu:
Resposta acima era para o comentário anterior #fail
Responder
Rodrigo de Oliveira Neves escreveu:
Olá à todos,
Tinha uma problema para utilizar a classe canvas em uma imagem específica dentro de 1 layout.
Para resolver isto, o que fiz foi:
Quando eu chamo, por exemplo: criacanvas.php (que é o arquivo onde está todo o código que trata a imagem e mostra na tela), ele automaticamente determina que a página criacanvas.php é na verdade uma imagem correto?
Por este motivo, se dermos print em algo, embaralha com o código da imagem e aparece todos aqueles caracteres estranhos.
Para resolver o que fiz foi o seguinte: coloquei a chamada da página na opção "src" da tag "img"... assim:
Pronto.. problema resolvido.. ou seja.. em qualquer lugar do meu layout, eu posso adicionar a imagem.
Espero ter ajudado..
Responder
Rodrigo de Oliveira Neves escreveu:
Esqueci de colocar as tags "code" no último post. Segue agora...
<img src="criacanvas.php?imagem=minhaimagem.jpg">Responder
henrique escreveu:
Ola davi tava testando sua classe aqui
no caso de um múltiplo upload ela nao esta gerando a segunda imagem nao
só consegui fazendo um restart na classe
foreach ($grupo as $fotos) {
echo $fotos;
if (!empty($fotos)) {
$path_new = $path . '/menor/' . $fotos;
$img = new canvas($path_new);
$img->carrega($fotos)
->redimensiona(83, 83, 'crop')
->grava($path_new);
$path_new = $path . '/maior/' . $fotos;
$img = new canvas($path_new);
$img->carrega($path_new)
->redimensiona(800, 600, 'proporcional')
->marca('album/marca_dagua.png', 'baixo', 'esquerda')
->grava($path_new);
}
}
Responder
Thiego escreveu:
Como posso por o efeito de carremento instantâneo na imagem como no site do Pisto in madri?
Responder
Luciano Mancini escreveu:
ola...
preciso colocar um texto na imagem, porem o texto nao pode conter fundo, tem q ser com fundo transparente.
essa classe faz isso ?
Responder
Jean Quaresma escreveu:
Boa Noite
Olá gostaria de saber se esta classe tem algum método que eu consiga dizer a coordenada da imagem base onde vou colocar a outra imagem??
Pelo que vi tem este método marca( 'marca.png', 'topo', 'centro' ) mas na minha aplicação preciso fazer várias sobreposições na mesma base em diferentes lugares.
Obrigado
Responder
Tullio escreveu:
Bom dia!
Primeiramente parabens pela iniciativa, ficou muito bom!
A minha duvida é o seguinte:
estou usand o crop, porém não curto muito crop centralizado pq geralmente corta a cabeça das pessoas, queria saber como faço o crop descartando sempre a parte de baixo, ou seja a imagem alinhada pelo "top"
Desde já Obrigado!!
Abraço
Responder
Henrique E. Araujo escreveu:
Davi, como vai? Espero que bem!
Cara eu to conseguindo salvar a imagem redimensionada e renomeada pra um diretório com CHMOD 777, tudo vai tranquilo, PORÉM...
A imagem não aparece no site (o x vermelho), aparece quebrada. Quando tento abri-la pelo browser diretamente, aparece:
Forbidden
You don't have permission to access /henrique/imagens/kBsB6GdWa.jpg on this server.
Abraço!
Responder
samuel caldasd escreveu:
poderia ter a opção de redimencionar proporcionalmente en relação a altura ou largura
Responder
Vinicius T.Werneck escreveu:
Caramba, a sua classe quebrou um galhaço, vale mesmo, ótimo trabalho.
Responder
Eduardo escreveu:
ALGUEM AJUDA AE???
A imagem eh redimensionada e renomeada, mas nao abre no navegador, dá acesso a leitura não permitido. A pasta ja ta permitindo Leitura, Listagem e Escrita. As imagens uploadeadas no meu site aparecem quebradas portanto!
Responder
Davi Ferreira escreveu:
Fala Eduardo,
provavelmente o Apache, quando gera as imagens, está colocando as permissões erradas. Você pode tentar forçar a permissão com chmod, por exemplo:
<?php chmod('imagem_criada.jpg', 0755);Alguma coisa do tipo, tô meio enferrujado com PHP. Vê a permissão necessária também, talvez 0755 seja muito :)
Espero que ajude!
Responder
Jackson escreveu:
Amigão poxa primeiro meus parabéns pelo projeto e pela classe, há bastante tempo que estava procurando algo assim, tchê não consegui fazer funcionar pelo banco de dados, mais acredito que seja um problema na locaweb, vou esperar pra ver se a GD deles está certinha, no meu server funcionou com uma imagem no caminho direto vou testar pelo servidor agora, Abr.
Responder
Denis escreveu:
Davi é possível fazer crop em uma área especifica da imagem tipo topo, baixo, direta, esquerda. Digo isso pq não vi nenhum exemplo com esta característica.
Meus parabéns pelo trabalho que realizou, realmente é ficou muito bom, eu só tenho a agradecer.
Responder
Paulo Henrique escreveu:
Alterei o código de preenchimento e agora funciona perfeitamente pra mim (preenchimento tanto vertical quanto horizontal):
substitua:
if ( $this->nova_largura >= $this->nova_altura )por
if ( $this->altura >= $this->largura)Responder
rodrigo nascimento escreveu:
Bom dia Davi,
eu estou usando a classe e aproveito para lhe dar os parabéns, pois ela é muito boa e útil. Gostaria de saber se existe uma forma de eu retornar caso a imagem tenha sido gravada ou não. Deixe-me explicar melhor. Eu to usando a classe da seguinte maneira:
$oCanvas
->carrega($vImagem['tmp_name'])
->redimensiona("180","120","crop")
->grava($sDirImagemPequena.$sImagem);
Está dessa maneira porque é um array de $_FILES e pelo que eu entendi o método grava() serve para salvar a foto em seu novo estado no diretório informado, correto? Mas nesse caso eu quero enviar a imagem para esse diretório com a função move_uploaded_file() que no caso, me retorna um boolean informando se movi ou não, ou então saber se a foto foi gravada com sucesso.
Mais uma vez, obrigado e parabéns pela classe.
Responder
Robson Kerner escreveu:
Bom dia Galera!!!
Estou com um problema...
Usando a classe deste artigo ou simplesmente as funções do php para trabalhar com imagens, tenho como retorno na tela um monte de códigos.
Estou com a biblioteca GD instalada no servidor.
Alguma idéia do que pode ser?
Obrigado.
Att,
Robson Kerner.
Responder
Miguel escreveu:
Ola Davi,]
consegui implementar da seguinte forma:
$img = new canvas();
$img->carregaUrl( 'upload/img38.jpg' )
->redimensiona( 200, 100, 'crop' )
->grava();
Mas o que eu preciso é criar varios thumbs, um do lado do outro, e ja tem muito código antes disso.
Pelo que li para mostrar a imagem direto na tela, não pode ter nenhum código antes disso. Preciso direto na tela pois já tenho as imagens em tamanho grande no disco.
Tentei colocar e gera erro, se coloco sozinha a função como esta ai funciona, mostra a imagem certinho.
A lista de imagens que tenho estão no banco de dados, já fiz o sql, tudo blz e funciona, mas como você disse num POST acima, não pode nem ter um "echo" antes da função, isso que fiquei em dúvida, não devo estar sabendo implementar corretamente para o que eu quero.
Como devo proceder ?
ABraços
Responder
Rodrigo escreveu:
Fala Davi,
Sabe de uma função que pega texto em html e já trata os casos de itálico, negrito, sublinhado, tipo de fonte, cor, etc e gera uma imagem para esse texto formatado?
Abraço
Responder
Cristiano escreveu:
Cara, simplesmente fantástico. Uma iniciativa espetacular esta de valorizar os programadores brasileiros. Já sou seu fã, e olha que nem abri o código ainda. rsrs
Sucesso Sempre! Abraço!
Responder
Vinycius Maia escreveu:
Existe alguma documentação ou especificações completas dessa classe?
Responder