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
blurIMG_FILTER_GAUSSIAN_BLUR"Embaça" a imagem, com desenfoque gaussiano.
blur2IMG_FILTER_SELECTIVE_BLUR"Embaça" a imagem, com desenfoque seletivo.
brilhoIMG_FILTER_BRIGHTNESSAltera o brilho da imagem, definido através do parâmetro arg1.
cinzasIMG_FILTER_GRAYSCALEConverte a imagem para tons de cinza.
contrasteIMG_FILTER_CONTRASTAltera o contraste da imagem, definido através do parâmetro arg1
colorirIMG_FILTER_COLORIZEConverte a imagem para tons da cor especificada. Arg1, arg2 e arg3 corrspondem às cores R, G e B - e o arg4 é o canal alfa.
edgeIMG_FILTER_EDGEDETECTDestaca os traços da imagem.
embossIMG_FILTER_EMBOSS"Acimenta" (ugh) a imagem.
negativoIMG_FILTER_NEGATEInverte todas as cores da imagem.
pixel
IMG_FILTER_PIXELATEPixeliza 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
ruidoIMG_FILTER_MEAN_REMOVALAdiciona ruído, aplicando um efeito do tipo rascunho.
suaveIMG_FILTER_SMOOTHSuaviza 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

Mauro escreveu:

Uma boa seria colocar a classe no github para mais pessoas poderem contribuir.

Responder

Davi Ferreira

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

Vedovelli

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

Alberto escreveu:

Muito bom Davi, como eu faço pra gravar em uma pasta ? ->grava( 'imagens/' ); ? Abraço

Responder

Vinicius Almeida

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

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

Fernando Souza

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

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

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

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

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

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

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

Davi Ferreira escreveu:

Fala Brayan, não conheço não, cara, vou dar uma pesquisada. É legal? Mesmo objetivo? Valeu!

Responder

Ivan Júnior

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

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

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

Fernando Souza

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

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

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

Giolvani escreveu:

Show Dani! Voltei a usar sua classe, ta muito bom cara, parabéns...

Responder

Davidson Ferreira

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

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

jose pedro

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

Van Neves escreveu:

Ae Davi, arrebentou dessa vez, show de bola mesmo! Parabéns!

Responder

Danilo Luiz

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

Jackson escreveu:

Muito bom o artigo! onde baixo o arquivo canvas.php? Abraço.

Responder

Davi Ferreira

Davi Ferreira escreveu:

Fala, Jackson! Você consegue baixar aqui: http://github.com/daviferreira/canvas

Responder

Jackson

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

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

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

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

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é

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

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

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

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

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

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

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

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

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

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

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 preencheImagem Por 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 preencheImagem Com 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 Vicente

Responder

Ramon Vicente

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 Silva

Responder

Mateus Caldas Craveiro

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Everton escreveu:

já resolvi!!!

Responder

Yeremi Loli

Yeremi Loli escreveu:

Opa... Estou tentando usar a classe mas sempre que aparecem assim na minha tela: r�e���؁�@

Responder

Everton

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

marcelo escreveu:

caro everton como vc fez isso?

tb estou com esse problema!!!

Responder

Leonardo

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

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

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

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

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

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

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

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

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

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

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

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

Pablo escreveu:

Se você fechar corretamente a tag da Function } ou fechar o ; do seu include provavelmente funcione.

Responder

Giovani

Giovani escreveu:

Não estou conseguindo baixar os exemplos e Canvas beta dá pau no link..

Responder

bruno

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

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

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

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

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

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

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

Isaias escreveu:

Perfeito!
Ótimo trabalho, me ajudo muito!!!

Abraço, Fique com Deus!

Responder

Cesimar Dias

Cesimar Dias escreveu:

Perfeito! Não preciso falar mais nada. Rsrs

Responder

Miller

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

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

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

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

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

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

_marcioBrandao escreveu:

Muito boa essa classe. Vou usar

Responder

Maicon Voltolini

Maicon Voltolini escreveu:

http://www.assemblysys.com/dataServices/php_roundedCorners.php

Com essa funcionalidade, a classe ficaria ainda mais irresistível!

Responder

marcelo

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

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

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

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

Mayara

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

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

Rodrigo Braga escreveu:

Muito Show sua classe cara!! Parabens! Sugestão de upgrade, round Corners, uso bastante! abraço!

Responder

Davi Ferreira

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

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

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

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

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

Rafael - Fish escreveu:

Parabens cara!

salvou a minha vida! :D

Responder

Gilton Guma

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

Diogo Queiroz

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

Romero Araujo escreveu:

Alex consegui solucionar esse erro, agora eu errei e postei a resposta no item abaixo :)

Responder

Alex cota

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

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

Romero Araujo escreveu:

Resposta acima era para o comentário anterior #fail

Responder

Rodrigo de Oliveira Neves

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

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

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

Thiego escreveu:

Como posso por o efeito de carremento instantâneo na imagem como no site do Pisto in madri?

Responder

Luciano Mancini

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

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

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

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

samuel caldasd escreveu:

poderia ter a opção de redimencionar proporcionalmente en relação a altura ou largura

Responder

Eduardo

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

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

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

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

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

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

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

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

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

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

Vinycius Maia escreveu:

Existe alguma documentação ou especificações completas dessa classe?

Responder

Deixe seu comentário:

(Seu e-mail não será divulgado - serve apenas para validação e gravatar.)

(Tags HTML permitidas: <strong> <em> <code> <a>)