07 de setembro de 2007
118Manipulando e redimensionando imagens com PHP
Quem nunca precisou desenvolver uma galeria de imagens? Ou até mesmo um simples módulo para destaques de um site, com o redimensionamento automático de fotos para a capa? Manipulação de imagens é uma das tarefas mais comuns em sistemas web e pode vir a ser uma tarefa chata caso toda vez você tenha que reinventar a roda e reescrever dezenas de linha de código para adequar a manipulação aos desejos do cliente.
Neste post apresento uma classe desenvolvida na agência web M2BRNET, exclusivamente para o tratamento e manipulação de imagens utilizando PHP e sua extensão GD.
A classe, apelidada de m2brimagem, ainda está em seu estágio inicial, mas já possui métodos para redimensionamento e conversão de formatos, entre outros. Algumas funções foram reaproveitadas e todos os devidos créditos acompanham o arquivo fonte.
Pré-requisitos
Para utilizar a classe, será necessário o download de sua última versão no link abaixo além de um servidor com php instalado com suporte à biblioteca GD.
Exemplo 1
Agora vamos ao que interessa! Neste primeiro exemplo realizaremos um redimensionamento simples, mantendo a proporção da imagem com a opção crop.
teste.php
<?php
include('m2brimagem.class.php');
$oImg = new m2brimagem('1.jpg');
$valida = $oImg->valida();
if ($valida == 'OK') {
$oImg->redimensiona(200,200,'crop');
$oImg->grava();
} else {
die($valida);
}
exit;
?>;
O primeiro passo é instanciar o objeto da classe imagem, carregando no construtor a imagem que será manipulada:
include('m2brimagem.class.php');
$oImg = new m2brimagem('1.jpg');
Logo na sequência validamos a imagem através do método valida. Caso o resultado seja 'OK', executamos os métodos para redimensionamento e geramos a nova imagem com saída no navegador. Se a imagem não existir, ou simplesmente não for um arquivo de imagem, o script retornará a mensagem de erro.
$valida = $oImg->valida();
if ($valida == 'OK') {
$oImg->redimensiona(400,200);
$oImg->grava();
} else {
die($valida);
}
Clique aqui e veja o arquivo teste.php em ação!
Exemplo 2
Vamos agora dar uma leve incrementada em nosso arquivo teste.php, fazendo com que ele passe a receber via parâmetros as novas dimensões da imagem e o nome do arquivo, permitindo assim o redimensionamento on the fly:
<?php
include('m2brimagem.class.php');
$arquivo = $_GET['arquivo'];
$largura = $_GET['largura'];
$altura = $_GET['altura'];
$oImg = new m2brimagem($arquivo);
$valida = $oImg->valida();
if ($valida == 'OK') {
$oImg->redimensiona($largura,$altura,'crop');
$oImg->grava();
} else {
die($valida);
}
exit;
?>
A imagem abaixo está sendo redimensionada em tempo real utilizando o exemplo anterior (confira aqui a imagem original).
<img src="exemplo2.php?arquivo=2.jpg&largura=200&altura=200" />

Exemplo 3
E que tal varrer todo um diretório, criar thumbnails e ao mesmo tempo manter as imagens originais? Alguém aí falou em galeria de imagens?
<?php
// include da classe m2brimagem
include('m2brimagem.class.php');
// instancia objeto m2brimagem
$oImg = new m2brimagem();
// define diretórios
$diretorio = 'galeria/';
$dir_thumbs = $diretorio.'thumbs/';
// varre diretório com as imagens originais
$arquivos = scandir($diretorio);
// lista arquivos do diretório
// e pega somente os de extensão jpg ou jpeg
foreach($arquivos as $arquivo) {
if(eregi(".+.[jJ][pP][eE]?[gG]$", $arquivo)) {
// "carrega" arquivo
$oImg->carrega($diretorio.$arquivo);
$valida = $oImg->valida();
if ($valida == 'OK') {
// redimensiona
$oImg->redimensiona(80,80,'crop');
// salva no diretório das miniaturas
$oImg->grava($dir_thumbs.$arquivo,100);
echo "Miniatura criada para "
. $diretorio.$arquivo
. "<hr />";
} else {
echo "Erro ao criar miniatura para "
. $diretorio.$arquivo
. ": " . $valida . "<hr />";
}
}
}
exit;
?>
Voilá! No exemplo acima, o script varre o subdiretório galeria, procura por arquivos do tipo JPG e cria suas miniaturas dentro de galeria/thumbs/.
Exemplos rápidos
Confira alguns outros métodos da classe m2brimagem em ação:
Marca d'água
// arquivo, x, y, alfa
$oImg->marca('marca.png',40,10,NULL);

Flip
$oImg->flip('h');

Texto / legenda
$rgb = array(255,255,255);
// texto da legenda, tamanho do texto, x, y, cor (array rgb),
// truetype (true ou false), nome da fonte
$oImg->legenda('teste legenda','11','20','20',$rgb,false,NULL);

Como citei no início deste post, a classe ainda está em um estágio inicial do desenvolvimento. Diversas melhorias já estão na nossa lista. Para participar e acompanhar o desenvolvimento, enviar comentários, dúvidas e correções, acesse a página do projeto no Google Code.
Atualizações [26/11/2008]
O leitor Giolvani enviou uma implementação de um método para adicionar marcas d'dágua com posicionamento fixo. Segue o exemplo de uso:
$oImg->marcaFixa('marca2.png','baixo_direita');

Clique aqui para conferir todos os posicionamentos disponíveis.
Já nosso amigo CACA-[COBRA] identificou um bug no método de marcas d'água. O parâmetro alfa não estava funcionando corretamente. Na verdade, trata-se de uma limitação da biblioteca GD. Para utilizar transparência na marca d'água, é necessário usar a função imagecopymerge ao invés da imagecopy. O problema é que ela não preserva a transparência original do PNG.
A correção que fiz foi a seguinte: caso você passe um valor para alfa, a classe utilizará a imagecopymerge para criar a marca, gerando uma trasparêcia global para a imagem, mas perdendo o fundo (ou qualquer outra parte) transparente da imagem de marca original. Caso opte por preservar esta transparência original, basta passar o valor de alfa como nulo.
Para entender melhor, veja este exemplo.
Finalizando, também foram corrigidos alguns bugs, incluindo um que afetava a qualidade de imagens JPEG quando a saída era direta no navegador. O método resize (redimensionamento sem especificar crop ou fill) também foi alterado: agora seu redimensionamento não preserva a proporção, distorcendo a imagem se necessário - para manter a proporção passe somente a altura ou largura.
Atualizações [26/02/2010]
Finalmente dei uma revisada no código. Nessa atualização melhorei alguns métodos e criei duas novas funcionalidades: redimensionamento com porcentagem e crop com as posições x e y definidas manualmente.
Para redimensionar com porcentagem, basta passar a largura ou a altura com o símbolo de %. Por exemplo:
// 29% da altura da imagem original, largura na proporção
$oImg->redimensiona('', '29%');
// 50% da largura da imagem original, altura na proporção
$oImg->redimensiona('50%', '');
Para definir as posições X e Y do crop na imagem (o padrão é centralizar o crop), utilize o novo método posicaoCrop:
$oImg->posicaoCrop( 20, 30 ); // x = 20, y = 30 $oImg->redimensiona( 100, 100, 'crop' );
E, por último, a propriedade RGB para preenchimento agora é armazenada via método, recebendo como parâmetro os valores R, G e B (o padrão é 0, 0 e 0 - preto):
$oImg->rgb( 255, 255, 255 ); // branco $oImg->redimensiona( 200, '', 'fill' );
118 leitores comentaram este artigo
14/09/2007
12:25
Ramon escreveu:
Bonito seu blog, parabéns!
Está tudo bem explicado. Gostei também que você deixou os códigos separados da numeração de linha.
Estou tentando fazer o tutorial. Quando terminar comentarei algo, ou pedirei ajuda. Sou iniciante em php e estou procurando tutorial sobre isso. Até agora nenhum funcionou de acordo com meus superficiais conhecimento.
Responder
17/09/2007
22:59
Higor Delgado escreveu:
Parabens pelo Blog, muito boa sua maneira de explicar.
Tem como você publicar como se manipula um arquivo? tipow.. gravar em memoria, testar qual o tipo, tamanho e se possível com barra de progresso?
Podia fazer 2 tutoriais um com barra e outro sem barra.
Abraço!
Responder
18/09/2007
00:30
Davi Ferreira escreveu:
Valeu pelos comentários, rapaziada :)
@Ramon: qualquer dúvida é só falar. A documentação da classe ainda é praticamente inexistente, mas espero que este post te ajude!
@Higor: tá nos meus planos um artigo sobre upload com barra de progresso etc. Assim que rolar um tempo livre.
Responder
24/09/2007
11:22
Leo Lima escreveu:
muito bom seu blog...parabéns
Responder
24/10/2007
03:50
Tiago Rocha escreveu:
Era o que eu precisava, não a galeria mas redimensionar as fotos!
valeu cara, rodei a net toda parei aqui!
Parabéns! add favoritos
Responder
06/03/2008
12:17
fabio escreveu:
amigo, sua funcao, por algum motivo nao esta gerando thumb de gif animado
Responder
29/08/2008
18:40
Danilo escreveu:
Amigo..
usei este codigo..
mas aki da um erro..
que nao consigo arrumar
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}'
nao mexi em nada no codigo..
estou tentando usar o exemplo3
Responder
14/09/2008
22:55
Davi Ferreira escreveu:
@Fabio: o GD não gera gif animado mesmo, não tem como.
@Danilo: Veja se na hora de copiar o código você não esqueceu alguma coisa. Ou então repara nas aspas se estão OK, às vezes dá pau na hora de copiar/colar, tem que digitar as aspas de novo.
Responder
20/11/2008
18:14
Giolvani escreveu:
cara, fantástica sua biblioteca, com ela resolvei meus problemas.
Vi que tem algumas implementações a serem feitas, e tomei a iniciativa de fazer uma, fiz agora o posicionamento das marcas d'agua por constantes...
na verdade peguei a idéia de outra biblioteca, mas preferia a sua por ser em portugues...
entao como faço para mandá-la para voce para que compartilhe?!!!
abraços
Responder
21/11/2008
20:36
CACA-[COBRA] escreveu:
Muito boa essa classe, porem tem um "defeito" o metodo "marca()" não insere transparencia, apesar de ter uma variável que indica esse recurso.
Eu tentei pesquisar na internet sobre isso mas não encontrei nada que ajudasse.
Se vocês tiverem alguma dica sobre isso ia ser legau. :)
Responder
21/11/2008
21:08
Davi Ferreira escreveu:
@Giolvani: te mandei um e-mail :)
@Cobra: Pois é, tava mexendo nisso hoje! O problema é que tem um bug no php com relação a isso. Se você alterar lá no método marca, de imagecopy pra imagecopymerge e adicionar o alfa como último parâmetro, ele vai funcionar, só que o imagecopymerge não preserva a transparência de PNGs. Particularmente prefiro manter o alfa do PNG, mas se quiser implementa assim, no lugar do imagecopy que tá lá:
if ( is_numeric( $alfa ) && ( $alfa < 100 ) ) {
imagecopymerge( $this->img, $marcadagua, $x, $y, 0, 0, $marca_w, $marca_h, $alfa );
} else {
imagecopy( $this->img, $marcadagua, $x, $y, 0, 0, $marca_w, $marca_h );
}
Responder
30/11/2008
02:31
Tula escreveu:
Me ajudou bastatnte essa biblioteca! parabéns!
Só fiz uma pequena alteração para funcionar com php4. Abraço
Responder
30/11/2008
23:01
Tuka escreveu:
Opa... Tudo bom?? só tenho uma pergunta, como faço para tratar imagens que venham de formulário??
Responder
03/12/2008
03:14
vitor escreveu:
eu consegui rodar esse script mas pra onde vai o thumb da imagem?
Responder
03/12/2008
03:18
vitor escreveu:
deu errado. agora n ta rodando.
boto la pra abrir a imagem dota.jpg mas ele da o erro mostrando o diretorio q o meu projeto está.
Responder
03/12/2008
05:51
Davi Ferreira escreveu:
@Tuka: você recebe a imagem através da global $_FILES, aí fica a seu critério se você salva ela antes de tratar ou já trata direto utilizando o arquivo temporário do php ($_FILES['nome_campo']['tmp_name']). Tá aí um exemplo legal pra fazer! Só não esquece do enctype="multipart/form-data" no form.
@vitor: cola o erro completo aí pra gente ver :P Mas parece ser problema de permissão ou erro de digitação no caminho da imagem.
Responder
11/12/2008
12:07
André G. escreveu:
Cara...ótimo ! tem td e mais um poco
Responder
14/12/2008
17:29
Laecyo Marcello escreveu:
Cara tentei usar mas esta dano erro no header não mudei nada e esta dano esse erro
Responder
14/12/2008
17:35
Davi Ferreira escreveu:
@Laecyo: Cola o erro completo aqui ou manda um link de exemplo.
Responder
15/12/2008
19:01
Igor S. escreveu:
Olá Davi.
Primeiro gostaria de te dar os parabéns pelo seu post.
Tenho uma dúvida, para passar a imagem via form é assim que faz?
$oImg = new m2brimagem($_FILES['foto_img']['tmp_name']);
O form está com enctype="multipart/form-data", mas não funciona.
Responder
16/12/2008
01:05
Davi Ferreira escreveu:
@Igor: podecrer, num comentário acima falei pra utilizar direto o tmp_name, mas o problema é que o arquivo temporário do $_FILES vai com a extensão 'tmp', independente do formato. A classe não reconhece isso como imagem. Tem duas opções:
1) move o arquivo com move_uploaded_file pra um diretório temporário no servidor, carrega ela na classe e depois apaga com unlink. Particularmente recomendo esta, por ser mais elegante :)
2) modificar a classe pra aceitar também a extensão tmp. Não tem problema de segurança porque além da extensão também valida se é um arquivo de imagem ou não. Basicamente é adicionar nos métodos eImagem, criaImagem e grava, onde tiver jpg, a extensão tmp.
Qualquer coisa me manda um e-mail no form de contato abaixo que eu te mando exemplos de código disso!
Responder
20/12/2008
17:54
Rocky escreveu:
Ótima classe, estou implementando algumas funções que eu tinha feito para uma classe minha. Assim que estiver tudo ok lhe passo.
Responder
26/12/2008
15:06
Marcos escreveu:
Parabéns!
Denota que tens sólidos conhecimentos de PHP e que tens muita vontade e disposição em ajudar.
Uma abraço!
Responder
30/01/2009
16:14
Vinicius Salsotto escreveu:
Cara, voce já fez sua boa ação de hoje!
Salvou uma vida, a minha!
Perfect! Totalmente Perfect essa classe!
Da até para fazer chover com ela! hehehe
Parabéns e Obrigado!
Responder
05/02/2009
17:28
Julio escreveu:
Parabéns pela biblioteca, muito útil mesmo.
Só gostaria de tirar uma dúvida.
Qual modificação precisa ser feita para funcionar no Php4?
TRabalho com o php5, mas existe um cliente meu que ja tem contrato com um servidor que da superte a php4.
Se alguem puder me ajudar eu agradeço!
Atenciosamente
Julio Pucciarelli
Responder
05/02/2009
18:07
Davi Ferreira escreveu:
@Julio: basicamente é remover os 'public', 'private' etc. Tudo que for orientação a objeto. Depois posso te mandar uma versão php4 se você tiver muita dificuldade em portar. :)
Responder
06/02/2009
01:27
Julio escreveu:
Obrigado Davi, acho que dou conta, mais qualquer problema eu peço socorro!
Muito Obrigado!
Responder
09/02/2009
23:50
Marcos Zacharias escreveu:
Caro Davi. Muito legal seu blog.
So tem um porem, quando dimensiono um JPG ta dando pau.
o erro é o seguinte call undefined function imagecreatefromjpeg() in m2brimagem.class.php on line 185.
Pois bem eu to tentando implementar um programa em php-gtk pra dimensionar fotos com esta biblioteca, ja que trabalho em um site de jornalismo e redimensionar cada uma no photoshop demora demais.
Pergunto oq esta errado para acusar este erro?
segue o código php
include('m2brimagem.class.php');
$janela = new GtkWindow();
$area= new GtkFixed();
$Rotulo = new GtkLabel('Informe o diretorio a ser processado');
$textbox = new GtkEntry();
$largura = new GtkEntry();
$altura = new GtkEntry();
$processa= new GtkButton('Processa Imagens',true);
$processa->connect_simple('clicked','processa_imagem');
$Rotulo2 = new GtkLabel('Informe a largura da imagem');
$Rotulo3= new Gtklabel("Informe a altura da imagem");
$area->put($Rotulo,2,10);
$area->put($textbox,2,25);
$area->put($processa,2,150);
$area->put($Rotulo2,2,50);
$area->put($largura,2,65);
$area->put($Rotulo3,2,90);
$area->put($altura,2,105);
$janela->add($area);
$janela->set_title("SBSCidade - Sistema redimencionador de fotos");
$janela->set_default_size(400,200);
$janela->set_position(GTK::WIN_POS_CENTER);
$janela->show_all();
function processa_imagem()
{
// instancia objeto m2brimagem
$oImg = new m2brimagem();
// define diretórios
$diretorio = 'galeria/';
$dir_thumbs = $diretorio.'thumbs/';
// varre diretório com as imagens originais
$arquivos = scandir($diretorio);
// lista arquivos do diretório
// e pega somente os de extensão jpg ou jpeg
foreach($arquivos as $arquivo) {
if(eregi(".+.[jJ][pP][eE]?[gG]$", $arquivo)) {
// "carrega" arquivo
$oImg->carrega($diretorio.$arquivo);
$valida = $oImg->valida();
if ($valida == 'OK') {
// redimensiona
$oImg->redimensiona(80,80,'crop');
// salva no diretório das miniaturas
$oImg->grava($dir_thumbs.$arquivo,true);
echo "Miniatura criada para "
. $diretorio.$arquivo
. "";
} else {
echo "Erro ao criar miniatura para "
. $diretorio.$arquivo
. ": " . $valida . "";
}
}
}
}
GTK::Main();
Grato Marcos Zacharias.
OBS: O programa ainda não ta 100% pronto
Responder
10/02/2009
00:40
Davi Ferreira escreveu:
@Marcos: esse erro rola quando a biblioteca GD não está configurada/instalada no php. Infelizmente não sei como funciona com o php-gtk. Vou dar uma pesquisada e qualquer coisa te falo! Caso não role GD com GTK (o que acho difícil), a solução seria fazer uma aplicação rodando em um apache instalado na máquina, no browser.
P.S. Organizei seus comentários, espero que não se importe :)
Responder
10/02/2009
11:10
Marcos Zacharias escreveu:
grato Davi, tanto pela dica e por organizar o comentário.
A questão é onde consigo a GD pra instalar junto com o GTK e terminar o projeto?
Responder
10/02/2009
11:39
Marcos Zacharias escreveu:
Outra coisa a extension=php_gd2.dll esta ativada na configuração o php-gtk mas mesmo assim não consigo obter exito, o que mais pode estar errado?
Responder
10/02/2009
12:05
Davi Ferreira escreveu:
Fala Marcos! Já verificou se existe essa DLL lá no diretório do php? E se o caminho das extensões está correto?
Não sei também como é no php-gtk, mas no php normal geralmente o php.ini fica dentro do diretório do Windows.
Responder
10/02/2009
13:07
Marcos Zacharias escreveu:
Ja , no php-gtk por padrão fica na pasta php-gtk2/ext a dll esta lá, consegui até resolver isso. Agora só tem um detalhe que seria php mesmo q esta me deixando meio doido. Não to conseguindo definir um diretório no C: da maquina pra que seja usado no scandir($diretorio); ela não aceita por exemplo eu passar como parameto C:galeria.
Responder
10/02/2009
14:34
Marcos Zacharias escreveu:
outra coisa php-gtk nada mais é do que uma extensão do proprio php.
Seria como usar a Gimp Tool Kit dentro do php, oque me resulta em um software do lado cliente com janelas botões etc escrito em código php.
No demais é td a mesma coisa. O pepeino agora é como fazer a função scandir() do php pegar um diretório que esta na maquina local e redimensionar as fotos.
Tem como fazer isso com a função, nem q seja em php puro? Ai depois eu me viro pra fazer as adaptações.
Grato Deste ja por todas as ajudas que recebi
Marcos Zacharias
Responder
10/02/2009
14:55
Davi Ferreira escreveu:
Tenta:
$diretorio = 'c:\galeria\';
ou
$diretorio = 'c:/galeria/';
Responder
10/02/2009
15:18
Marcos Zacharias escreveu:
Valeu Davi. Agora Funcinou redondo. Vou terminar o projeto e depois me sinto na obrigação de postar o código completo aqui.
Grato Marcos Zacharias.
Responder
12/02/2009
20:56
Fábio Dante escreveu:
Parabéns Davi,
A forma como você explica e demonstra, fica até mais fácil de aprender.
Seu blog já esta em favoritos.
Tenho um problema nesta página www.webix.com.br/fotos , estava funcionando perfeitamente até eu mudar de host, agora algumas funcionam e outras não.
O que pode ser?
Sei muito pouco de php, se puder me ajudar.
segue o código:
= 500){
$new_width = 500;
$new_height = ($height * $new_width) / $width;
}else {
$new_width = $width;
$new_height = $height;
}
} else {
}
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
imagejpeg($image_p, null, 75);
imagedestroy($image_p);
?>
Desde já, muito obrigado.
Responder
13/02/2009
16:28
Fábio escreveu:
Esta dando o seguinte erro:
Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: gd-jpeg, libjpeg: recoverable error: Premature end of JPEG file in /home/webix/public_html/fotos/m2brimagem.class.php on line 185
Warning: imagecreatefromjpeg() [function.imagecreatefromjpeg]: 'imagens/famosos/jessica_alba16.jpg' is not a valid JPEG file in /home/webix/public_html/fotos/m2brimagem.class.php on line 185
Warning: imagecopyresampled(): supplied argument is not a valid Image resource in /home/webix/public_html/fotos/m2brimagem.class.php on line 331
Warning: Cannot modify header information - headers already sent by (output started at /home/webix/public_html/fotos/m2brimagem.class.php:185) in /home/webix/public_html/fotos/m2brimagem.class.php on line 593
ÿØÿàJFIFÿþ
neste link http://www.webix.com.br/fotos/red.php?arquivo=jessica_alba16.jpg&largura=200&altura=200
mas neste funciona
http://www.webix.com.br/fotos/red.php?arquivo=rss.jpg&largura=200&altura=200
Você sabe porque?
Responder
17/02/2009
01:58
Davi Ferreira escreveu:
Fala Fábio. Dei uma pesquisada no Google e parece ser um erro com php5 e alguns arquivos de imagem gerados no Mac.
Tenta colocar a seguinte linha no início do seu código, pro GD ignorar esse tipo de erro.
ini_set(’gd.jpeg_ignore_warning’, 1);Responder
17/02/2009
19:05
Julio escreveu:
Davi, eu postei a alguns dias sobre funcionar a biblioteca em php4, eu não consegui ainda, tem como você me mandar uma versão para php4? se não for incomodo é claro...
abração!
Responder
23/02/2009
18:10
Carlos escreveu:
Davi, essa classe me ajudou muito.
Valeu pela iniciativa de contribuir.
Grande abraço cara!
Responder
28/02/2009
03:46
Danillo escreveu:
Oi Davi, parabéns.. muito bom este script e muito bem comentado.. =)
mas estou com um problema.. não consigo rodá-lo aqui.. uso o EasyPHP e já habilitei a biblioteca GD e nada.. estou utilizando os mesmos códigos do exemplo.. e coloco uma imagem chamada img4.jpg na pasta.. e coloco o código..
mas nada acontece.. fica em braco e não dá erro nenhum.. oq será?? Sabe me ajudar??
ps: sou ini em php hehehe =)
abraçoss
Responder
28/02/2009
04:05
Danillo escreveu:
Oi Davi.. agora tá funcionando.. percebi q o arquivo com o nome da classe estava errado..
Mas aimgaem fica achatada.. gostaria de passar apenas um parâmetro.. que seria o da largura. Mas quando retiro o parâmetro do código não aparece nada.. Ex:
Pois eu queria q fosse feito um redimensionamento proporcional para não achatar a imagem.. como eu poderia fazer isso??
abraçosss
Responder
28/02/2009
04:16
Danillo escreveu:
Davi, descup ai postar diversos comentários assim viu.. hehehe eh pq nao tenho como deletar daki.. hehehe
conseguir resolver o problema.. e na verdade não ficava achatada a imagem não.. devido a função crop neh?!
mas tirei a funcão crop e os parâmetros de altura.. e deixei somente largura.. aí ele redimensiona proporcionalmente.. =)
vlw pelo script.. com certeza me ajudará bastante.. =)
abraçosss
Responder
03/03/2009
00:25
Andryon escreveu:
mto obrigado
resolveu todos os meus problemas
sou mto grato a vocÊ
Responder
10/03/2009
00:15
Feliphe Bueno escreveu:
Valew ai cara, muito interessante o artigo e serviu como uma luva em minha aplicação, brigadao mesmo...
Abraço...
Responder
13/04/2009
17:08
Eduardo escreveu:
Fala Davi,
primeiramente parabéns pelo post... sem sombra de dúvidas é de ótima qualidade..
to com o seguinte problema... quando eu coloca o destino como parâmetro no
$oImg->grava()
dá pau... não consigo salvar a imagem em uma pasta... ele "sobrescreve" o arquivo
queria fazer isso $oImg->grava($diretorio);
mas toda vez que coloco esse parametro dá
Notice: Undefined index: extension in C:Arquivos de programasEasyPHP 2.0b1wwwduzacaclassesm2brimagem.class.php on line 557
Responder
13/04/2009
19:03
Davi Ferreira escreveu:
Fala Eduardo. Ali no grava, além do diretório, você tem que informar tambem o nome do arquivo.
Por exemplo:
$oImg->grava('C:Arquivos de programasEasyPHP 2.0b1wwwduzacateste.jpg');
A extensão não precisa ser a mesma do arquivo de origem.
Responder
15/04/2009
14:10
Bruno Zanotti escreveu:
Muito bom, porém aqui fica dando um erro(eu estou tentando usar o exemplo 1) :
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in m2brimagem.class.php on line 15
ele está dando erro antes de executar meu script.
Fora isso ta muito bom o material , Parabéns
Responder
16/04/2009
17:49
Leandro escreveu:
Muito obrigado pela dica
Nossa matou a pau aqui o que eu esta precisando.
100%
Valews, fica com Deus
Responder
27/04/2009
04:07
Vagner Rogério Batista escreveu:
Olá Davi !
Muito boa sua classe, adicionei aqui a criação de diretórios quando não existentes na função grava("nome_do_dir_inexistente_ou_nao_dir").
Responder
01/05/2009
15:45
Davi Ferreira escreveu:
@Vagner: boa idéia! Se quiser mandar aí sua implementação fique a vontade!
Responder
01/05/2009
18:04
Eduardo Oliveira escreveu:
Fala Davi,
Deu certo o esquema de eu salvar no diretorio passado pela variável, fiz até uma "graça" para o cliente, coloquei uma drop down para escolher a medida de redimensionamento (Grande, Média, Sem redimensionar).
Novamente parabéns pelo post.
Abraços.
Responder
03/05/2009
16:54
CACA-[COBRA] escreveu:
Só passando pra dar um Salve!!!
Essa classe já passou a ser parte de minhas ferramentas de trabalho ;)
Valew Davi
Responder
04/05/2009
03:49
Breno Matos escreveu:
parabens fera hehe.. salvou minha vida
Responder
08/05/2009
11:24
Anderson escreveu:
Olá.. gostaria de saber uma coisinha..
Digamos que eu possua um espaço com a largura de 100px.. `Preciso colocar uma figura redimensionada alí dentro, mas nao sei as dimensoes dessa figura.. Como configurar para que o arquivo.php só receba o nome da foto e a largura de forma a ele gerar um thumb com a largura especificada redimensionando proporcionalmente a altura??
Responder
08/05/2009
11:25
Anderson escreveu:
Esqueci de marcar que gostaria de receber a resposta por e-mail..
Responder
16/05/2009
06:35
Samyr Alencar escreveu:
Olá Davi!
Bacana esta sua biblioteca, também gostei do formato do post e do blog.
Uma pergunta continuou o desenvolvimento da lib?
Esta versão para download é a última?
Obrigado e um abraço.
Responder
20/05/2009
20:17
Eduardo Oliveira escreveu:
Fala Davi,
Outra dúvida, faço o upload da imagem através do form, utilizo o move_uploaded_file, passa as medidas para o redimensiona(), salvo a imagem e armazeno no banco.
Agora como faço para gerar uma thumb dessa mesma imagem.
Por exemplo, eu vou cadastrar uma foto, faço o upload, além de "tratar" a foto para deixar num tamanho padrão, quero gerar um thumb da mesma.
Responder
21/05/2009
22:27
Fabiano escreveu:
Davi, teria como encaminhar a versão PHP 4 ? ou disponibilizar aqui (porque são alguns os usuarios desta versão ainda)
Responder
27/05/2009
20:00
Bruno escreveu:
Olá, parabéns pelo tutorial!
Estou apenas com um problema.
Estou trabalhando num site que usa um sistema de admin que envia noticias para o banco de dados e na página de noticias eu uso o seu código para redimensionar a imagem. Porem é mostrada apenas a imagem (assim como no seu exemplo) e não mostra o resto da página.
Como resolvo isso, é algo na classe que você criou que faz isso?
Obrigado
Responder
29/05/2009
15:03
Diogo escreveu:
Cara, parabéns expecional!
Bela contribuição para comunidade PHP.
Responder
10/06/2009
00:51
Juniorman escreveu:
Cara, muito obrigado, é de gente como você que o mundo precisa, isso é autruismo
Responder
18/06/2009
16:41
Diego Trindade escreveu:
Davi tipo tem como pegar e jogar um GET pra exibir as imagens de outro site sabe?
ai pode redimensionar tbm ... e fazer tudo isso que vc fez ... ???
Responder
07/07/2009
19:33
Anderson Perrelli escreveu:
Se eu estiver fazendo o upload de um formulário no construtor da class eu paço o $_FIES['imagem'] ?
por exemplo
$oImg = new m2brimagem($_FIES['imagem']);
$valida = $oImg->valida();
if ($valida == 'OK') {
$oImg->redimensiona(200,200,'crop');
$oImg->grava();
} else {
die($valida);
}
isso funcionária?
Estou fazendo isso, mas ele da erro.
"Erro: Arquivo de imagem não encontrado!"
se não, como eu posso fazer utilizando um formulário?
Responder
07/07/2009
20:00
Eduardo Oliveira escreveu:
Fala Anderson,
Pra você pegar de um form você deve colocar também o diretório da imagem.
$diretorio = "uploads/";
$oImg = new m2brimagem($diretorio.$_FILES['imagem']);
Espero que tenha ajudado.
Responder
24/07/2009
12:03
Jadson G Silva escreveu:
Olá Davi!
O parâmetro qualidade da função public function grava($destino,$qualidade) não está funcional porque na primeira linha do da função você está setando o valor 100 para a variável qualidade sempre, ou seja, em todos os casos.
Na minha cópia alterei essa primeirla linha para $qualidade=($qualidade!=0)?$qualidade:100; e funciona legal agora.
Responder
28/07/2009
13:05
wagner escreveu:
Dae pessoas!
Super enrolado aqui com esse script, uma ajuda me cai bem!
$nomearquivo=md5( time().$_FILES['imagem']['name']).'.jpg';
$pasta='imgs/'.$nomearquivo;
if(move_uploaded_file($_FILES['imagem']['tmp_name'],$pasta))
{
include("script/m2brimagem_class.php");
$oImg = new m2brimagem();
$oImg->carrega($pasta.$nomearquivo);
$valida = $oImg->valida();
if ($valida == 'OK') {
$oImg->redimensiona(200,200,'crop');
$oImg->grava();
} else {
die($valida);
}
exit;
}
ERRO: imagem n encontrada,
mas ele salva no dir. correto
Responder
30/07/2009
17:38
Davi Ferreira escreveu:
Fala Wagner,
ali no método carrega você deveria passar só a variável $pasta, não? Já que ela recebe o diretório e o nome do arquivo. Do jeito que tá vai a pasta e o nome duas vezes.
Espero ter ajudado!
Responder
30/07/2009
17:42
Davi Ferreira escreveu:
@Jadson: valeu mesmo, cara! Publiquei lá a correção. Na verdade era só tirar a linha $qualidade = 100 já que no parâmetro ele já seta o default.
Responder
30/07/2009
19:21
Walison escreveu:
Olá, estou tentando utilizar essa classe. Aqui funcionou belezinha, mas o problema é as miniaturas criadas, a qualidade está péssima, num sei se tem como arrumar isso, ta tudo quadriculado ... se alguém poder me ajudar, fico no aguardo ...
Responder
31/07/2009
01:38
wagner escreveu:
Fantastico DAVI !...
q falta de atenção !...
tem maneira de colocar fundo na imagem, por exemplo uma borda branca?
Responder
03/08/2009
00:50
Vitor escreveu:
Até agora, foi a melhor classe para redimensionamento e recorte de imagens!
Responder
07/08/2009
10:10
Davi Ferreira escreveu:
Fala Wagner!
Esse lance da borda é uma boa idéia para um novo método da classe. Vou anotar aqui, mas se alguem quiser adiantar... :)
De cabeça vem duas implementações. Uma é criar uma imagem com a cor da borda e dando um merge por trás da imagem atual. A outra é usar a função imagerectangle() do php: http://br.php.net/imagerectangle
Responder
07/08/2009
12:03
wagner escreveu:
Grande Davi!!!
grande sacada, vou ver se consigo executar umas das duas...
por hora
o server me retorna esse erro
Fatal error: Allowed memory size of 25165824 bytes exhausted (tried to allocate 12288 bytes) in /home/.../m_2brimagem_class.php on line 185
Responder
07/08/2009
12:42
Bruno escreveu:
Bom dia Davi,
Direto ao ponto...
Quando eu executo o redimensionamento das imagens aqui (igualzinho ao exemplo 3 do post), as miniaturas geradas ficaram com qualidade muuuuito ruim (quadriculadas). Li todos os comentários, mas não encontrei nada a respeito.
Veja como são as imagens originais e como ficaram depois de executar o script: http://www.brunowebdev.com.br/resultadom2brimage.jpg
Voce tem ideia do que pode estar ocorrendo?
Se souber, então poderia dizer como contorno isso?
Meu SO é Win XP SP3, rodando PHP via XAMPP.
Desde já agradeço e parabéns você é muito bom... no php! he he
Responder
07/08/2009
13:08
wagner escreveu:
Bruno!
dentro da classe
procure por
$qualidade = 100
e troque por
$qualidade=($qualidade!=0)?$qualidade:100;
.......................
Davi
no fatal error de cima a imagem tem 1mb!
Responder
07/08/2009
13:25
Davi Ferreira escreveu:
@Bruno: foi mal, atualizei a classe mas esqueci de atualizar o post. O método grava agora não tem mais o parâmetro salvar, que era aquele 'true' do exemplo:
Troca de:
$oImg->grava($dir_thumbs.$arquivo,true);
Para:
$oImg->grava($dir_thumbs.$arquivo,100);
O PHP tava interpretando o true como 1, então a qualidade de saída ia como 1.
@Wagner: no seu script você vai ter que usar um ini_set para definir a memória limite, ou então mexer direto no php.ini se você tiver acesso. Usa o set_time_limit tambem só pra garantir. Segue um exemplo:
ini_set("memory_limit","50M");
set_time_limit(0);
Valeu!
Responder
07/08/2009
13:26
Bruno escreveu:
Valeu Wagner, depois que você sitou a variável $qualidade dei uma lida no código da classe com um pouco mais de atenção percebi que ao executar o método grava, bastava passar 100 para o parâmetro $qualidade.
Antes estava assim (exemplo):
// salva no diretório das miniaturas $oImg->grava($dir_thumbs.$arquivo,true);
Ficou assim:
// salva no diretório das miniaturas $oImg->grava($dir_thumbs.$arquivo,100);
FUNCIONOU!!!
Responder
08/08/2009
17:01
Ricardo Aguiar escreveu:
Davi
Valeu o post, seu blog está ótimo, já está nos favoritos.
Vou
Abraço
Ricardo
Responder
12/08/2009
01:01
Eduardo escreveu:
Caro colega meu código tá apresentando o seguinte erro abaixo após usar as seguintes linhas de código:
$oImg = new m2brimagem();
$oImg->marcaFixa('images/cabecalho.jpg','topo_centro');
ERRO GERADO:
Warning: imagecopy(): supplied argument is not a valid Image resource in C:..m2brimagem.class.php on line 468
Fatal error: Cannot redeclare imagecreatefrombmp() (previously declared in C:..m2brimagem.class.php:645) in C:..m2brimagem.class.php on line 731
Responder
15/08/2009
16:04
CMAG escreveu:
Caro amigo, a imagem fica totalmente escura, estou enviando de um upload para a sua classe os parametros chegam corretamente, a imgem e gerada no tamando correto mais fica totalmente escura o que deve ser... abraço valeu
Responder
22/08/2009
09:29
Beto escreveu:
como faço redimensionar um imagem que tem a altura maior que a largura sem esticar horizontalmente.
Responder
02/09/2009
12:27
Start escreveu:
Como posso utilizar agora ? ja que eu tenho o scrpith como agora eu vou fazer o sistema para o pessoa fazer o upload e a foto msm chegar ate eles !
Ex :http://aprendizmuonline.net/logoexclusiva/
ai um
Responder
09/09/2009
23:21
Patrick escreveu:
Olá Davi,
muito útil essa classe.
Vim aqui pra dizer que essa classe está me ajudando muito.
Essa classe já passou a ser parte de minhas ferramentas de trabalho [2]
E valeu pelo apoio ao Oraculum Framework, ajudou muito.
Abraço
Patrick
Responder
17/09/2009
14:58
Luis escreveu:
Cara muito bom!
isso que eu tava precisando!
valeu mesmo!
tudo de bom ae!!
Responder
18/09/2009
23:31
Baixe VipDown escreveu:
Da para postar este script pronto para hospedar porque eu não sei como faço para este script fucionar
Responder
21/09/2009
13:16
Mayco Deivid escreveu:
Olá Davi!
Bem, todos já elogiaram bastante e realmente ficou muito bom!
Trata-se de uma necessidade do momento em que estamos viveciando na web.
É um sonho de praticamente todo programador!
Tenho certeza de que todos que se depararam com este trabalho estão satisfeitos com o resultado. Fenomenal!
Estou profundamente agradecido! Excelente!
Para aqueles que obtiveram o seguinte erro ao executar o código e utilizam o EasyPhp, basta baixar e instalar a versão atual do EasyPhp 2.0
Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}'
obs.: Essa classe já passou a ser parte de minhas ferramentas de trabalho (3)
Qualquer coisa estou a disposição para ajudar no que for possível.
:)
Responder
21/09/2009
13:50
Davi Ferreira escreveu:
Legal, Mayco, obrigado! :)
Só testando, divulgando etc. já está ajudando bastante.
Esse erro que você citou acontece quando a versão do PHP é 4.
Valeu!!
Responder
10/10/2009
23:09
Andre Freitas escreveu:
Ei davi,tem como vc postar pra nós o script com o upload completo até com o form"enviaar" dentro, please meu patrão vai me demitir se eu não fizer isso, por favor davi.Andre Freitas,Grato.
Responder
02/11/2009
22:04
Manipulação de imagens usando PHP « Matheus Cassiano escreveu:
[...] muito bom em seu blog. Mas vamos ao que interessa, o trackback já tá mandado e o link está em: http://www.daviferreira.com/blog/2007/09/07/classe-imagem-php.html que por sinal está [...]
Responder
17/11/2009
11:35
Joao Vitor escreveu:
Cara, nao consigo exibir a imagem redimensionada:
valida();
if ($valida == 'OK') {
$oImg->redimensiona($largura,$altura,'crop');
$oImg->grava($uploaddir.$arq,true);
} else {
die($valida);
}
?>
Como faço para exibir a imagem agora ?
Valeu.
Responder
17/11/2009
11:36
Joao Vitor escreveu:
Estou enviando a parte do codigo
$uploaddir = '../images/upload/videos/';
$arq = $v['imagem_g'];
$largura = 135;
$altura = 100;
$oImg = new m2brimagem($uploaddir.$arq);
$valida = $oImg->valida();
if ($valida == 'OK') {
$oImg->redimensiona($largura,$altura,'crop');
$oImg->grava($uploaddir.$arq,true);
} else {
die($valida);
}
Responder
17/11/2009
20:05
Davi Ferreira escreveu:
<img src="<?php echo $uploaddir.$arq; ?/>" />
:)
Responder
17/11/2009
11:51
CACA-COBRA escreveu:
Rapaiz haja paciência Com esses caras, Deus do céu :P
Responder
02/01/2010
10:03
William escreveu:
Davi,
Ajudinha, baixei sua classe fiz conforme no ex: 1 e 2 acima o 3 está funcionando perfeito!
Porém no ex: 1
a imagem não aparece no browser
só aparece o seguinte texto!
http://www.meusite.com.br/script/teste.php
Sabe o que pode ser? Já tentei em 2 host e os 2 está com o mesmo problema!
Responder
05/01/2010
09:39
Davi Ferreira escreveu:
Fala aí, William!
Geralmente esse erro rola quando o script de saída da imagem gera algum erro antes de exibir a imagem. Aí como o header é de imagem aparece só o endereço. Experimenta usar error_reporting(1) nesse script e, se funcionar, depois dá uma debugada nele! :)
Responder
05/01/2010
15:34
William escreveu:
Davi,
Testei local agora, apresentou o seguinte erro: Cannot modify header information - headers already sent by
Consegui arrumar colocando ob_start(); e ob_end_flush();
Porém ainda continua aparecendo o endereço da pagina! Fiz o que vc falou mas não mudou nada!
Tem outra dica ai?
Responder
11/02/2010
03:51
Davi Ferreira escreveu:
Fala William,
publica aqui ou me envia o código pra eu dar uma olhada, aí posso te ajudar melhor.
Abrá!
Responder
05/01/2010
20:37
Davi Ferreira escreveu:
Então, cara, tá dando algum erro/warning antes do header da foto. Ou está dando saída em algum HTML... Cola aqui o script inteiro ou então tira os headers do final e vê que mensagem está rolando.
Responder
17/01/2010
13:10
Diogo escreveu:
Davi, muito fera esta classe, mas gostaria de saber como posso redimensionar a imagem proporcional ao seu tamanho pra não distorcer. Pois usando crop eu recorto uma parte da imagem, e passando valor sem o crop ela fica de um tamanho exato, como faço pra ser proporcional? Obrigado.
Responder
17/01/2010
13:20
Davi Ferreira escreveu:
Fala Diogo,
passa só a largura ou só a altura nova, pra mater a proporção:
$oImg->redimensiona(200,'');
ou
$oImg->redimensiona('',200);
Quero mudar isso assim que tiver um tempo :)
Valeu!
Responder
25/01/2010
10:19
Rodrigo escreveu:
Bom dia,
Gostaria de dar meus parabéns pelo tutorial.
Muito bem explicado e com excelente conteúdo.
Mas tenho uma dúvida.
Há possibilidade de receber uma imagem de 180kbytes de 1024x768, por exemplo.
E redimencioná-la para 1/3 deste tamanho, fazendo com que o tamanho da imagem (kbytes) também diminua?
valeu,
Responder
11/02/2010
03:50
Davi Ferreira escreveu:
Fala, Rodrigo!
Pra redimensionar nesse esquema, 1/3 do tamanho, ainda não tem nada implementado na classe. Mas você pode fazer uma função por fora ou criar o método na classe.
Usa a getimagesize(), função nativa do PHP, pra pegar a largura/altura (ou pega direto na classe) e depois tira a proporção do tamanho.
Quanto menor forem largura e altura, menor vai ser o tamanho em KBs.
Responder
08/02/2010
18:37
Klismark escreveu:
Como faço pra modificar a permissão da imagem criada na função grava.
Está gravando uma imagem com permissão 644 , não consigo nem apagar a imagem do servidor.
Parabéns..Muito bom esse blog
Responder
09/02/2010
02:00
Davi Ferreira escreveu:
Fala Klismark :)
Dá um chmod depois de gerar a imagem:
chmod( 'nome_do_arquivo', 0755 );
Troca ali pela permissão que você quiser. Essas que você não consegue apagar, é porque elas ficam associadas ao usuário do apache, então e só fazer um script pra apagá-las.
Valeu!
Responder
11/02/2010
03:10
Roberto escreveu:
Tenho a mesma dúvida do Rodrigo.
Se há possibilidade de diminuir o tamanho de kbytes de uma imagem durante ou depois do upload.
Obrigado,
Roberto
Responder
11/02/2010
03:48
Davi Ferreira escreveu:
Fala Roberto,
você redimensionando a imagem depois do upload, já reduz o tamanho dela em kbytes também.
Responder
17/02/2010
17:29
diogo escreveu:
Cara, achei um problema no seu codigo, na linha 69 o is_file retorna erro se a imagem possui espaços, eu resolvi usando o php.net/file_exists
Responder
18/02/2010
04:36
Davi Ferreira escreveu:
Fala Diogo,
aqui o is_file funciona na boa, com espaço ou não. Não sei se é só em servidores Windows ou alguma coisa do tipo. Ou algum outro caractere? De qualquer forma fica aí a dica se alguém passar pelo mesmo erro :)
Responder
23/02/2010
19:59
Viviane escreveu:
Boa Noite, otimo tutorial, estava precisando exatemente disso, mas quero saber se tem como apenas redimensionar a imagem?
pois notei que esta cortando uma imagem que tenho, retirei o crop e a imagem nao ficou boa, tem alguma outra opcao?
Obrigada..
estou usando o exemplo2
Responder
26/02/2010
15:08
Davi Ferreira escreveu:
Oi Viviane,
se tirar o crop ele vai redimensionar distorcendo mesmo. Uma solução é passar somente a largura ou somente a altura, aí a classe acha o valor que falta mantendo a proporção. Exemplo:
$oImg->redimensiona( $largura, '' );
// ou
$oImg->redimensiona( '', $altura );
Espero que ajude.
Responder
28/02/2010
13:38
gab escreveu:
Obrigada!! =)
Responder
28/02/2010
13:46
gab escreveu:
Davi o pedacinho do meu código não funfou...
veja:
.....
if ($valida == 'OK') {
$oImg->posicaoCrop( 0, 0 );
$oImg->redimensiona($largura,$altura,'crop');
$oImg->grava();
} else { .......
No caso gostaria que pegasse a imagem 'on top'.
Tbm notei que no arquivo da classe não tem nada especificado posicaoCrop.
Pode me ajudar?
Responder
01/03/2010
03:18
Davi Ferreira escreveu:
Você precisa baixar a nova versão da classe pra atualizar o código.
Responder
Deixe seu comentário