Manipulando e redimensionando imagens com PHP

Este artigo está desatualizado. Confira aqui a nova versão da classe.

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" />

redimensionamento em tempo real

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);
    

marca d'água

Flip

    $oImg->flip('h');
    

flip horizontal

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);
    

legenda em texto

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');

marca d'água

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' );

173 comentários.

  • Ramon

    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.

  • Higor Delgado

    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!

  • Davi Ferreira

    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.

  • Wesley Barbosa

    15/08/2010
    15:22

    Wesley Barbosa escreveu:

    troquei a função por esta mas a imagem png continua com fundo transparente aparecendo branco quase transparente. O que pode ser?

  • Leo Lima

    24/09/2007
    11:22

    Leo Lima escreveu:

    muito bom seu blog...parabéns

  • Tiago Rocha

    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

  • fabio

    06/03/2008
    12:17

    fabio escreveu:

    amigo, sua funcao, por algum motivo nao esta gerando thumb de gif animado

  • Danilo

    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

  • Davi Ferreira

    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.

  • Giolvani

    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

  • CACA-[COBRA]

    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. :)

  • Davi Ferreira

    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 img, $marcadagua, $x, $y, 0, 0, $marca_w, $marca_h, $alfa ); } else { imagecopy( $this->img, $marcadagua, $x, $y, 0, 0, $marca_w, $marca_h ); }

  • Tula

    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

  • Tuka

    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??

  • vitor

    03/12/2008
    03:14

    vitor escreveu:

    eu consegui rodar esse script mas pra onde vai o thumb da imagem?

  • vitor

    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á.

  • Davi Ferreira

    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.

  • André G.

    11/12/2008
    12:07

    André G. escreveu:

    Cara...ótimo ! tem td e mais um poco

  • Laecyo Marcello

    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

  • Davi Ferreira

    14/12/2008
    17:35

    Davi Ferreira escreveu:

    @Laecyo: Cola o erro completo aqui ou manda um link de exemplo.

  • Igor S.

    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.

  • Davi Ferreira

    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!

  • Rocky

    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.

  • Marcos

    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!

  • Vinicius Salsotto

    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!

  • Julio

    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

  • Davi Ferreira

    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. :)

  • Julio

    06/02/2009
    01:27

    Julio escreveu:

    Obrigado Davi, acho que dou conta, mais qualquer problema eu peço socorro! Muito Obrigado!

  • Marcos Zacharias

    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

  • Davi Ferreira

    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 :)

  • Marcos Zacharias

    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?

  • Marcos Zacharias

    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?

  • Davi Ferreira

    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.

  • Marcos Zacharias

    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.

  • Marcos Zacharias

    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

  • Davi Ferreira

    10/02/2009
    14:55

    Davi Ferreira escreveu:

    Tenta: $diretorio = 'c:\galeria\'; ou $diretorio = 'c:/galeria/';

  • Marcos Zacharias

    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.

  • Fábio Dante

    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.

  • Fábio

    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?

  • Davi Ferreira

    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);

  • Julio

    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!

  • Carlos

    23/02/2009
    18:10

    Carlos escreveu:

    Davi, essa classe me ajudou muito. Valeu pela iniciativa de contribuir. Grande abraço cara!

  • Danillo

    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

  • Danillo

    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

  • Danillo

    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

  • Andryon

    03/03/2009
    00:25

    Andryon escreveu:

    mto obrigado resolveu todos os meus problemas sou mto grato a vocÊ

  • Feliphe Bueno

    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...

  • Eduardo

    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

  • Davi Ferreira

    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.

  • Bruno Zanotti

    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

  • Leandro

    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

  • Vagner Rogério Batista

    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").

  • Davi Ferreira

    01/05/2009
    15:45

    Davi Ferreira escreveu:

    @Vagner: boa idéia! Se quiser mandar aí sua implementação fique a vontade!

  • Eduardo Oliveira

    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.

  • CACA-[COBRA]

    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

  • Breno Matos

    04/05/2009
    03:49

    Breno Matos escreveu:

    parabens fera hehe.. salvou minha vida

  • Anderson

    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??

  • Anderson

    08/05/2009
    11:25

    Anderson escreveu:

    Esqueci de marcar que gostaria de receber a resposta por e-mail..

  • Samyr Alencar

    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.

  • Eduardo Oliveira

    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.

  • Fabiano

    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)

  • Bruno

    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

  • Diogo

    29/05/2009
    15:03

    Diogo escreveu:

    Cara, parabéns expecional! Bela contribuição para comunidade PHP.

  • Juniorman

    10/06/2009
    00:51

    Juniorman escreveu:

    Cara, muito obrigado, é de gente como você que o mundo precisa, isso é autruismo

  • Diego Trindade

    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 ... ???

  • Anderson Perrelli

    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?

  • Eduardo Oliveira

    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.

  • Jadson G Silva

    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.

  • wagner

    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

  • Davi Ferreira

    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!

  • Davi Ferreira

    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.

  • Walison

    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 ...

  • wagner

    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?

  • Vitor

    03/08/2009
    00:50

    Vitor escreveu:

    Até agora, foi a melhor classe para redimensionamento e recorte de imagens!

  • Davi Ferreira

    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

  • wagner

    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

  • Bruno

    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

  • wagner

    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!

  • Davi Ferreira

    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!

  • Bruno

    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!!!

  • Ricardo Aguiar

    08/08/2009
    17:01

    Ricardo Aguiar escreveu:

    Davi Valeu o post, seu blog está ótimo, já está nos favoritos. Vou Abraço Ricardo

  • Eduardo

    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

  • CMAG

    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

  • Beto

    22/08/2009
    09:29

    Beto escreveu:

    como faço redimensionar um imagem que tem a altura maior que a largura sem esticar horizontalmente.

  • Start

    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

  • Patrick

    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

  • Luis

    17/09/2009
    14:58

    Luis escreveu:

    Cara muito bom! isso que eu tava precisando! valeu mesmo! tudo de bom ae!!

  • Baixe VipDown

    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

  • Mayco Deivid

    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. :)

  • Davi Ferreira

    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!!

  • Mayco Deivid

    24/09/2009
    16:10

    Mayco Deivid escreveu:

    Olá Davi! // Davi é um nome Bíblico para quem não sabe! Gostaría de saber se você sabe como realizar o redimencionamento de imagens diretamente no browser utilizando apenas o mouse? ( ex. yahoo, orkut e gravatar ) Caso saiba, sería possível disponibilizar o código/classe, criar um tópico ou mesmo incluir neste? Já que tem tudo haver com o assunto... Abraços, agradeço pela atenção despendida.

  • Andre Freitas

    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.

  • Manipulação de imagens usando PHP « Matheus Cassiano

    02/11/2009
    22:04

    Manipulação de imagens usando PHP &laquo; 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á [...]

  • Joao Vitor

    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.

  • Joao Vitor

    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); }

  • Davi Ferreira

    17/11/2009
    20:05

    Davi Ferreira escreveu:

    <img src="<?php echo $uploaddir.$arq; ?/>" /> :)

  • Joao Vitor

    18/11/2009
    15:25

    Joao Vitor escreveu:

    Valeu cara, T+

  • CACA-COBRA

    17/11/2009
    11:51

    CACA-COBRA escreveu:

    Rapaiz haja paciência Com esses caras, Deus do céu :P

  • William

    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!

  • Davi Ferreira

    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! :)

  • William

    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?

  • Davi Ferreira

    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á!

  • Davi Ferreira

    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.

  • Diogo

    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.

  • Davi Ferreira

    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!

  • Diogo

    17/01/2010
    16:31

    Diogo escreveu:

    Perfeito, quando tiver tempo e fizer estas alterações manda lá via Twitter, vlw! abs!

  • Rodrigo

    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,

  • Davi Ferreira

    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.

  • Klismark

    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

  • Davi Ferreira

    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!

  • Roberto

    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

  • Davi Ferreira

    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.

  • diogo

    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

  • Davi Ferreira

    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 :)

  • Viviane

    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

  • Davi Ferreira

    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.

  • gab

    28/02/2010
    13:38

    gab escreveu:

    Obrigada!! =)

  • gab

    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?

  • Davi Ferreira

    01/03/2010
    03:18

    Davi Ferreira escreveu:

    Você precisa baixar a nova versão da classe pra atualizar o código.

  • CACA-COBRA

    11/03/2010
    14:14

    CACA-COBRA escreveu:

    Fala aí Davi! Ontem eu tava aplicando este tutorial em um programa meu. http://www.passoapasso.info/programacao/pegar-miniatura-thumbnails-do-youtube.html Eu tentei aplicar sua classe nele pra por uma marca dagua porém sua classe parece que não consegue validar o arquivo. Tentei aqui mas não obtive sucesso, não prossegui por que não era mandatório. Mas pelo que percebi a classe não da suporte a arquivos remotos. Você poderia por esse suporte :D

  • Davi Ferreira

    11/03/2010
    15:48

    Davi Ferreira escreveu:

    Fala, Cobra! :) Realmente não dá suporte a imagens remotas, é uma boa implementar sim, assim que eu tiver um tempinho! Se quiser resolver por aí é só comentar ou modifcar os métodos que possuem is_file(), filesize(), file_exists()... Ou então baixa a imagem antes (file_get_contents(), wget etc.) cria um arquivo temporário e depois trata.

  • Vinícius - WebMaster

    19/03/2010
    21:47

    Vinícius - WebMaster escreveu:

    Cara, perfeito este artigo!!! resolveu meu problema!! parabéns mesmo...

  • Fábio Oberleitner

    26/03/2010
    09:51

    Fábio Oberleitner escreveu:

    Davi teria como você enviar para mim a versão do script para o php 4?

  • Brayan Tagliari Demarchi

    26/03/2010
    13:09

    Brayan Tagliari Demarchi escreveu:

    Cara, parabénsss pelo ótimo código, muito bom mesmo, me ajudou bastante aqui, mas estou com 2 dúvidas bem bestas mas que podem ser dúvida de mais gente aew. Ele só transforma em thumb img jpg? png nao? como faço para transformar png tb? e tem como colocar uma borda branca? No meu caso estou carregando algumas imagens e elas estão muito coladas uma na outra. se puder da um help :) No mais mais uma vez parabéns :D Era realmenteu o que eu estava procurando ^^ valeu

  • Rener

    19/04/2010
    08:04

    Rener escreveu:

    Estou com uma dúvida. Consegui usar a classe e interação com banco de dados, mas a imagem pra mostrar tem que estar no mesmo diretorio, teria como usando o metodo de variavel com get colocar o caminho da imagem tambem? Obrigado. Parabéns pelo post.

  • Leandro

    19/04/2010
    12:04

    Leandro escreveu:

    Ola, nao sei se vai ajudar fazendo isto, mais vi o seu sistema e tive que usar mais uma extensão TMP $extensoes_validas = array( 'jpg', 'jpeg', 'jpe', 'gif', 'bmp', 'png', 'tmp' ), porque como estou enviando em upload sem gravar na pasta recebo a foto pela função $_FILES['foto']['tmp_name'] para depois gravar na pasta. Se servir para alguma coisa espero ter ajudado.

  • Vaneves

    20/04/2010
    13:29

    Vaneves escreveu:

    Meu brother.. parabéns! Ficou show de bola... eu usava uma classe que faz as mesmas coisas que essa, só que 50x maior, e feita por gringos... valorizo de mais o trabalho dos brasileiros, e a partir de hoje vou usar só essa classe. Fiz uma alteraçãozinha que pra mim é muito importânte, coloquei pra redimencionar proporcionalmente. Tipo de 800 x 600 pra 80 x 60, antes só ficava quadrada. Link do código adicionar: http://codedumper.com/esaye Ai no switch do método redimensiona adiciona o código abaixo (antes do default) case 'ratio': $this->resizeRatio(); break;

  • Davi Ferreira

    26/04/2010
    04:10

    Davi Ferreira escreveu:

    Show de bola, cara. Valeu mesmo :) Assim que tiver uma folga aqui anexo sua modificação no post. Abrá!

  • Rodrigo

    30/04/2010
    15:20

    Rodrigo escreveu:

    Mesmo erro em localhost e no servidor uolhost "Warning: Cannot modify header information - headers already sent by (output started at C:\AppServ\www\testes\brain\teste.php:1) in C:\AppServ\www\testes\brain\m2brimagem.class.php on line 650 �����... O gd2 esta instalado o q falta?

  • felipe

    13/05/2010
    05:30

    felipe escreveu:

    Vou testar ela mas achei interessantíssima alteração do do Vaneves e acho que vc podia atualizar logo o post heheh depois venho relatar minhas experiências, abração

  • Davi Ferreira

    15/05/2010
    18:28

    Davi Ferreira escreveu:

    Oi, Felipe. Na verdade a classe já faz isso que o Vaneves falou, é só passar somente a largura (ou altura). Uma imagem de 800x600, por exemplo, se você só passar a largura como 80 ele já vai setar automaticamente a altura para 60. Valeu!

  • Vaneves

    29/05/2010
    09:49

    Vaneves escreveu:

    Eu tinha visto, é que usei a classe em uma galeria que fiz, ai o cliente poderia enviar imagem tanto 800 x 600 quanto 600 x 800, ou dimensões piores como 800 x 50000, ai se eu deixar só a largura buga o layout! Mas depois dei uma revisada e a classe tem esse mesmo código que postei, só que a lógica dos calculos são diferentes, fica no resizeFill, a diferença é que ele preenche o fundo deixando quadrada! Usando a idéia de OO, é só criar um método privado que faz esse redimensionamento e os resizeRatio e o resizeFill chamam ele, é só colocar um parâmetro (a propria cor RGB) pra saber se preenche o não o fundo.

  • Felipi

    18/05/2010
    10:07

    Felipi escreveu:

    Muito bom Davi, parabéns e obrigado pelo empenho.

  • Leonardo

    19/05/2010
    09:07

    Leonardo escreveu:

    Ola, estou estudando a possibilidade de usar a sua classe em meus projeos, mas pra isso precisaria que ela guardasse o arquivo redimenssionado... é possivel fazer isso na classe atual? ou teria que fazer modificações? Obrigado e parabens pela classe!

  • Leonardo

    19/05/2010
    10:51

    Leonardo escreveu:

    Esquece o comentario acima... achei aqui lendo a classe ^^ Mas ainda assim tenho uma duvida... quando eu redimenssiono usando o tipo 'fill', ele esta cortando a imagem quando a altura é maior que a largura... existe algum metodo que faz ele enquadrar a imagem nas medidas que eu passo pra ele sem distorcer ou cortar? obrigado

  • Leonardo

    19/05/2010
    12:44

    Leonardo escreveu:

    Ola, eu de novo... consegui arrumar mudando um pouco o metodo: resizeFill onde verifica a largura/altura pra ver como vai montar a imagem nova... deixei assim: // verifica altura e largura if ( $this->nova_largura > $this->nova_altura ) { $this->nova_largura = ( ( $this->largura * $this->nova_altura ) / $this->altura ); } else { $this->nova_altura = ( ( $this->altura * $this->nova_largura ) / $this->largura ); } // fim do if verifica altura largura

  • Davi Ferreira

    20/05/2010
    12:07

    Davi Ferreira escreveu:

    Fala Leo, beleza? Tem como você me passar as dimensões da imagem que você estava fazendo upload e as dimensões que você gostaria do resize? Só pra eu testar por aqui também, aí se for bug da classe mesmo eu altero lá :) Valeu!

  • HENRIQUE E. ARAUJO

    19/05/2010
    14:55

    HENRIQUE E. ARAUJO escreveu:

    Cara, eu estou tentando pegar a foto apartir de um formulário. Consigo imprimir na tela o nome da foto, tipo, tamanho tudo, mas dá sempre "Arquivo não encontrado!" , codigo: include('inc/m2brimagem.class.php'); ini_set('gd.jpeg_ignore_warning', 1); $arquivo = $_FILES['foto']; $largura = 150; $altura = 150; $diretorio = "img/pics__/"; $oImg = new m2brimagem($diretorio.$arquivo); $valida = $oImg->valida(); if ($valida == 'OK') { $oImg->carrega($diretorio.$arquivo); $oImg->redimensiona($largura,$altura,'crop'); $oImg->grava($diretorio.$arquivo,100); echo ""; } else { die($valida); } exit;

  • Davi Ferreira

    20/05/2010
    06:47

    Davi Ferreira escreveu:

    Fala Henrique! Cara, o $_FILES['foto'] não pode ser diretamente o arquivo. Dá um print_r nele que você vai ver. Ele é um array com os dados do arquivo. Você vai ter que usar o índice ['tmp_name']. E pra trabalhar direto com ela na classe, do upload, você vai ter que dar uma adaptada na classe, dá uma olhada nos comentários anteriores. Valeu!

  • HENRIQUE E. ARAUJO

    20/05/2010
    08:32

    HENRIQUE E. ARAUJO escreveu:

    Davi amigo... iNFELIZMENTE.... mesmo com o TPM_NAME ainda continua nao achando o arquivo. Repito que a pagina exibe o nome da foto normal. Só nao funciona com o seu caso. Segue codigo.. $arquivo = $_FILES['foto']['tmp_name']; $largura = 150; $altura = 150; $diretorio = "img/pics__/"; $oImg = new m2brimagem($diretorio.$arquivo); $valida = $oImg->valida();

  • Davi Ferreira

    20/05/2010
    12:06

    Davi Ferreira escreveu:

    Henrique, como falei no comentário anterior, a classe só aceita arquivos com extensão de imagem por enquanto. O tmp_name não tem extensão nenhuma. Ou você adapta a classe (alguém já fez isso aí em cima, eu acho) ou você move a imagem para o servidor antes e salva com o nome certinho.

  • Regiane

    20/05/2010
    06:00

    Regiane escreveu:

    Gostaria de saber como adaptar a classe para pegar a imagem do ftp, ou no ato do envio.. e salvar no ftp... poderia me ajudar?? obrigada

  • HENRIQUE E. ARAUJO

    21/05/2010
    15:21

    HENRIQUE E. ARAUJO escreveu:

    Davi, finalmente, depois que copiei a imagem para um diretorio temp funcionou. O que ocorre agora é o seguinte, eu quero gravar no banco de dados a imagem com OUTRO nome, ou seja, renomea-la. Dai devo renomear antes de redimensionar ou depois? Obrigado cara!

  • Davi Ferreira

    22/05/2010
    09:01

    Davi Ferreira escreveu:

    Fala, Henrique. Tanto faz, cara. No método grava você pode escolher o nome que vai salvar esse arquivo, por exemplo. Abraços!

  • HENRIQUE E. ARAUJO

    23/05/2010
    13:59

    HENRIQUE E. ARAUJO escreveu:

    Davi, deu certo! Ficou show, renomeando e gravando. Sua ferramenta é show de bola, obrigado.

  • Sandro Kerkhoven

    28/05/2010
    05:40

    Sandro Kerkhoven escreveu:

    tem como eu optar por redimensionar apenas se a imagem for maior que o especificado na função redimensiona ??

  • Davi Ferreira

    28/05/2010
    11:24

    Davi Ferreira escreveu:

    Fala Sandro, faz fora da classe. Você quer o que, largura maior, altura maior, ou ambos? Enfim, só fazer um if e, de acordo com a condição, redimensionar :) Pode usar tanto imagesize() quanto imagesx() e imagesy() pra pegar as dimensões atuais da imagem.

  • Vaneves

    29/05/2010
    09:50

    Vaneves escreveu:

    O método que postei mais acima faz isso "resizeRatio" =]

  • Arthur Barros

    31/05/2010
    13:14

    Arthur Barros escreveu:

    Como posiciono o tipo CROP da função redimensiona() para que ela corte do topo pra baixo, pq se estou tratando de uma imagem 100(largura)x300(altura) ela vai recortar no MEIO da imagem fazendo com que no caso se for uma imagem de uma pessoa que ela corte a face da pessoa

  • Davi Ferreira

    01/06/2010
    09:28

    Davi Ferreira escreveu:

    Tá no finalzinho do texto: 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' );

  • Hugo Ferreira

    02/06/2010
    06:36

    Hugo Ferreira escreveu:

    Criei um sistema gerenciador de galerias de imagens.... e a grande sacada mesmo é a opção de salvar a imagem já redimensionada proporcionalmente, e exibição das mesmas de acordo com as necessidades do cliente... Porém... fiz tudo na unha.... (redimensionamento, exibição, gravação, etc)... Na versão 2.0 do sistema vou adaptar esta classe pra todas as tarefas... Quando o fizer posto aqui o resultado.... Ótipo post..

  • Iaponã Pedroza

    02/06/2010
    14:26

    Iaponã Pedroza escreveu:

    Caro Davi, Deus te abençôe, te ilumine, te inspire e te ampare por todos os séculos dos séculos... Graças a essa classe eu resolvi um problemão que eu tava pra terminar o site de um cliente.... amigo, vc num faz idéia do qto me ajudou.... Deus te ilumine sempre... Muito obrigado... Abraços...

  • Willian Cima

    07/06/2010
    15:19

    Willian Cima escreveu:

    Olá, estou seguindo o Exemplo 2, mas estou com um probleminha. Veja só: http://www.theimageup.com/images_files/redimensionar.php?arquivo=39e728422cf45fcfd66f0dcabef9c630.jpg&largura=200&altura=200 Está dando erro 500 Coloquei o arquivo redimensionar.php (antes teste.php) dentro da página de imagens (images_files). Está correto? Abs.

  • Davi Ferreira

    08/06/2010
    06:21

    Davi Ferreira escreveu:

    Fala, Willian! Aqui carregou na boa esse link :) Abraços!

  • mateus

    12/06/2010
    09:46

    mateus escreveu:

    Amigo sou novatto nessa area e não tenho muito conhecimento em php Parabens pelo blog muito bem explicado.... Estou querendo implementar esse sistema de remensionamento num formulario de cadastro de usuarios poderia mim ajudar? como devo colocar o sistema de redimensionamento para que seja executado antes de enviar a imagem???

  • Vaneves

    01/07/2010
    06:26

    Vaneves escreveu:

    Cara, é o seguinte, a imagem tem que ser enviada para que possa executar o script, só que ela fica em um lugar temporário do servidor, ai é só você pegar ela e salvar no servidor conforme os tutoriais acima. Se não tem experiências com upload em PHP, olhe o esse link, no lugar da função move_uploaded_file() do PHP, utilize a classe

  • Joel

    19/06/2010
    07:13

    Joel escreveu:

    Daee Davi! Blz? Usei o exemplo 3 e dá mensagem de miniatura criada, porém não cria o thumbs no diretório. O que pode ser? Valeu!

  • Wallace

    19/06/2010
    12:56

    Wallace escreveu:

    Cara muito bom, estava procurando coisa do tipo esclarecedor sobre esse assunto. Parabéns

  • Luis Paulo

    02/07/2010
    15:18

    Luis Paulo escreveu:

    Fala Davi, parabéns. Tenho um sistema que envia as fotos para o FTP e guarda o nome e o caminho no banco de dados. Tem como eu utilizar a sua classe para redimensionar a imagem na hora de exibi-la no site ? Utilizei seu exemplo com uma imagem e deu o erro que está no link abaixo. http://www.marciozanetti.com.br/scripts/exibe_foto.php

  • Luis Paulo

    02/07/2010
    15:41

    Luis Paulo escreveu:

    Davi, Consegui rodar a classe em um arquivo somente com o código dos exemplos, quando coloco ele no layout que tenho pronto ele da erro. Mas nao uso Header em nenhum local, e ele retonra o erro Warning: Cannot modify header information - headers already sent by (output started at /home/storage/e/6c/5d/marciozanetti/public_html/scripts/exibe_foto.php:61) in /home/storage/e/6c/5d/marciozanetti/public_html/scripts/m2brimagem.class.php on line 650 Poderia me ajudar ?

  • Luis

    02/07/2010
    16:36

    Luis escreveu:

    Concluindo, quando coloco a classe no meio de outros codigos ou da pagina, ela só retorna um monte de quadrados e codigos, nao interpretando a imagem, por que isso acontece, em uma pagina sem nada funciona blz.

  • Willian Cima

    10/07/2010
    23:05

    Willian Cima escreveu:

    Davi, fiz uma sistema de upload de imagens, e agora quero começara a aceitar SWF. Como é difícil gerar thumb de SWF, gostaria de exibir uma imagem de erro, tipo: "Não foi possível gerar a miniatura" Pode me ajudar? Abraços.

  • Alstar

    12/07/2010
    15:54

    Alstar escreveu:

    Olá, antes demais, muitos parabens... tudo bem explicito. Eu andava a procurar uma maneira de transformar o fundo preto dos png´s e Gifs que tem transparencia em branco ou mesmo em transparente como o original... eu vi como se fez com o logo... Mas não consegui. o meu código é este: <?php include('m2brimagem.class.php'); $oImg = new m2brimagem('deco_treemangrove_icosn.png'); $valida = $oImg->valida(); $oImg->redimensiona(100,100,'crop'); $rgb = array(2,2,255); $oImg->legenda('www.teste.com','11','30','180',$rgb,false,NULL); $oImg->grava(""."lalala.png",100,true); echo "<img src='olddda.png'>"; ?> Alguma ajuda para que eu consiga mudar isso ? Obrigado

  • hari baba andi

    15/07/2010
    09:13

    hari baba andi escreveu:

    obg Senhor... era isso... Vlw cara lá de cima!!! kkkkkkkkk off line papai!

  • Willian Cima

    22/07/2010
    18:17

    Willian Cima escreveu:

    Davi, aqui estou eu novamente. É o seguinte: Quando tento redimensionar uma imagem BMP dá isso. Warning: imagecopyresampled() expects parameter 2 to be resource, boolean given in /home/theimage/public_html/images_files/m2brimagem.class.php on line 399 Warning: Cannot modify header information - headers already sent by (output started at /home/theimage/public_html/images_files/m2brimagem.class.php:399) in /home/theimage/public_html/images_files/m2brimagem.class.php on line 650 ÿØÿàJFIFÿþ Verifiquei mas não vi nada anormal. Pode me ajudar?

  • Paulo Nunes

    31/07/2010
    07:08

    Paulo Nunes escreveu:

    Cara, a classe e seu "método" de explicação são MUITO bons. Parabéns e, como estou estudando o código, voltarei para comentários e colaborações. Abraços e até breve.

  • Anderson Ferreira

    16/08/2010
    17:02

    Anderson Ferreira escreveu:

    Eu estava com problemas quando tentava reedimensionar as imagens (criar miniaturas). As PNG's estavam ficando com fundo preto :S Para quem estiver com o mesmo problema que o meu, basta abrir o arquivo "m2brimagem.class.php", e trocar: "$this->rgb( 0, 0, 0 );", por: "$this->rgb( 255, 255, 255 );" que ficará com o fundo branco ;D Abraços, Anderson Ferreira

  • Aguinaldo

    01/09/2010
    14:28

    Aguinaldo escreveu:

    Olá! Muito bom o programa cara, já achei vários do tipo, mas nenhum tão robusto! Mas to com problemas para usar no php4. Já removi os public e private do programa mas continua dando o erro abaixo: Parse error: parse error, expecting `T_OLD_FUNCTION' or `T_FUNCTION' or `T_VAR' or `'}'' in E:\vhosts\arandainternet.com.br\httpdocs\m2brimagem.class.php on line 15 Tem como dar um help, please?

  • Aguinaldo

    02/09/2010
    06:01

    Aguinaldo escreveu:

    Funcionou, obrigado.

  • João

    29/09/2010
    10:21

    João escreveu:

    Olá. Eu tenho uma pasta com meio mundo de fotos. Então quando vou gerar tub da errro no tempo de execução. com faria para arrumar isso ??? pois o numero de imagens passa dos 5000.

  • Alexandre

    29/09/2010
    11:02

    Alexandre escreveu:

    Cara muito boa a classe so tem uma coisa que não estou conseguindo redimensionar a imagem e retirar o fundo, faz o redimensionamento proporcional e retira o fundo! Pois pode se escolher a cor do fundo ou deixar o padrão que pega preto eu acho, mas não quero isso quero que fique sem fundo!

  • Kaléu Caminha

    30/09/2010
    08:10

    Kaléu Caminha escreveu:

    Fantástica classe. Só um complemento, usei uma imagem png com transparência e ao salvar perdeu essa transparência. Pesquisei e resolvi o problema aplicando a função: imagesavealpha($this->img, true); na linha 659 da função "grava" dentro do case "png". Abraços e obrigado.

  • Ciro

    07/10/2010
    23:07

    Ciro escreveu:

    Fiz umas adaptações e a classe encaixou como uma luva. Parabéns!

O envio de comentários está bloqueado para este post.
Ir para a capa do blog Publicado há mais de 4 anos, com 173 comentários.