Rafael Clares


Criar thumb (miniaturas) com PHP
Fevereiro 13, 2008, 2:14 am
Arquivado em: PHP | Tags: , ,

Gerando miniaturas de imagens com PHP

Olá, veremos como gerar miniaturas de imagens (thumb) para uma galeria de fotos, apresentação de produtos ou qualquer outra aplicação. É muito comum encontrarmos sites que exibem miniaturas de imagens ainda da forma antiga, que trata-se de simplesmente redimensionar a imagem com algum software e criar uma pasta chamada thumbs ou miniaturas, muitos aplicativos utilizam essa solução, mas se você pensar em alguma solução mais inteligente que dispense o trabalho do webdesigner por ex. um cms (gerenciador de conteúdo) fica difícil utilizar essa antiga solução, imagine vender ao seu cliente um sistema onde ele possa gerenciar seu conteúdo sem precisar de você, agora imagine que ele queira colocar miniaturas de fotos no site….dai complicou um pouco não é ? ele terá que enviar todas as imagens para você redimensionar e envia-las de volta para ele poder inserir no site, isso não parece ser um sistema com gerenciador de conteúdo, vamos tomar como exemplo um sistema para imobiliárias onde o proprietário cadastra os imóveis e envias as fotos para o site, agora tente imaginar a página principal com os imóveis em destaque……..estranho né, imagine um anúncio com uma foto 800×600 na página principal…agora imagine 20 anúncios como esse, eu acho que fica feio e você? Também não é, então vamos ver como mostrar a miniatura da foto original enviada para o sistema, acredite isso é muito simples!

Em 1º lugar verifique se o seu php está com a biblioteca gd ou gd2 instalada, se não estiver baixe o easyphp, instale e marque a opção gd2 em php extensions, alias o easyphp é maravilhoso, ele já instala o apache, php5 e mysql, se você não conhece está perdendo tempo, falarei sobre ele em um outro post.

Vamos ao arquivo index.php

<html>
<head>
<title>.: Thumbs :.</title>
</style> 
</head>
<body> 
    <img src=”thumb.php?img=image1.jpg” title=”imóvel cod 01″>
    <img src=”thumb.php?img=image2.jpg” title=”imóvel cod 02″>
</body>
</html>

Note que acima no src estamos passando a url da imagem para para o arquivo thumb.php, ao invés de passar diretamente a imagem, isso porque o arquivo thumb.php está encarregado de redimensionar a imagem original, mas esse redimensionamento ocorre somente na visualização, ele não altera propriamente a imagem, ela continua no seu tamanho original, apenas o que é mostrado é que foi redimensionado, isso tem que ficar claro, nenhuma imagem pequena é gerada, esse é o truque, o arquivo thumb.php apenas muda as propriedades da imagem para a visualização ok ?

Claro que nesse exemplo eu utilizei uma url pré-definida, mas para o caso de um sistema essa url deveria ser retornada por ex. de uma consulta SQL, no sisteminha (veja aqui o sisteminha) que fiz a algum tempo atrás eu criei uma tabela mais ou menos assim: codimovel_f , urlFoto, descFoto … onde no momento do upload da foto era feita uma inserção no banco de dados contendo a url da foto que acabara de ser enviada, para não repetir os nomes das imagens e eu não ter que ficar renomeando eu utilizei a função MD5() do PHP que gera um nome/string único, em um artigo posterior falarei sobre o MD5.

Vamos ver o tal arquivo chamado thumb.php

<?php
#recebendo a url da imagem
$filename = $_GET['img'];

#Cabeçalho que ira definir a saida da pagina
header(‘Content-type: image/jpeg’);

#pegando as dimensoes reais da imagem, largura e altura
list($width, $height) = getimagesize($filename);

#setando a largura da miniatura
$new_width = 120;
#setando a altura da miniatura
$new_height = 100;

#gerando a a miniatura da imagem
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

#o 3º argumento é a qualidade da miniatura de 0 a 100
imagejpeg($image_p, null, 50);
imagedestroy($image_p);
?>

Obs: Para salvar a imagem/thumb em um diretório altere a linha
imagejpeg($image_p, null, 50);
para
imagejpeg($image_p, ‘/diretorio/nomeImagem.jpg/’, 50);

Onde /diretorio/nomeImagem.jpg é o caminho e nome onde deseja armazenar a miniatura.

Muito simples não ? Agora você pode usar o CSS para dar uma geral nesse exemplo, ou pode fazer a coisa ficar mais bonita, você pode usar o lightbox, clique e veja o que você poderá fazer com LightBox! até a próxima.  

Download do pacote: thumbs.rar 
Aposto que quer ver funcionando!  então está ai o Thumbs funcionando

Rafael Clares


48 Comentários até o momento
Deixe um comentário

Olha otimo sistema de thumbs mais naum funcionou no meu servidor tenho php 5 sera q é isso ele tah erro interno 500 no iss”!!! o q sera q pode ser??? sera q pode me ajudar???

Comentário por David

Opa ja consegui resolver para funcionar no php5 tem q alterar as seguintes linha

// recebendo a url da imagem
$filename = $_GET['img'];

// Cabeçalho que ira definir a saida da pagina
header(‘Content-type: image/jpeg’);

Comentário por David

Entendi, o problema é que você copiou e colou o código e ele ao invés de estar com aspas/apostofros estava com o ascento agudo/crase. mas tá ai, quem for copiar e colar altere os sinais agudo/crase para aspas/apostofros.

Comentário por clares

Ola, boa noite.
Parabens pelos artigos acessiveis que voce tem publicado. Para foi bem util e numa linguagem simples, possibilitando melhorarmos futuras implementacoes.
Abraco.

Comentário por Carlos J. Souza

Carlos, obrigado pelo feedback.

Comentário por clares

Muito bom, usei e funcionou corretamente e sem complicação!!! Parabéns!

Comentário por Victor

era o que eu precisava, valeu, parabéns!

Comentário por Mauricio Biasotto

Não consegui, no Firefox só aparecem quadradinhos.

Comentário por João Luiz

Caro João, não só testei como o fiz visualizando no firefox, acredito que você tenha copiado o código e não alterou as aspas/apostrofos, leia os demais comentários ok. Obrigado pelo comentário.

Comentário por clares

Amigo, grato pela presteza, desculpe.
Segundo eu entendi as linhas devem ficar assim:
// recebendo a url da imagem
$filename = $_GET['img'];

// Cabeçalho que ira definir a saida da pagina
header(“Content-type: image/jpeg”);

Assim eu fiz. E ainda não funcionou.

Estou enviando para a página assim:
echo ”;

Será que o erro esta ai?

Comentário por João Luiz

João você tem instalada a biblioteca GD/GD2 no PHP? Se não tiver aconselho a você instalar o EasyPHP que já tem o PHP5 e as extensões necessárias, bastando apenas ativar através do próprio gerenciador do EasyPHP, por default o GD/GD2 está desabilitada. Talvez seja isso, ao clicar no link do exemplo funciona ai ? Abraços

Comentário por clares

A biblioteca esta instalada e funcionado. Sim o exemplo funciona.
Na minha pagina original as imagens aparecem grandes.
O que fiz foi substituir na linha:
echo ‘<img src=”‘;
// echo $files.$entrada_arq.’”;
O $files… por thumb.php?img

Comentário por João Luiz

João, me desculpe mas acho que você deveria ler novamente o post. Não tem como errar! De toda forma
irei disponibilizar o arquivo para download em http://clareslab.com.br/learn/thumbs.rar será mais fácil por que à medida que você vai alterando algo que já está funcionando eu já não tenho mais como ajuda-lo, infelizmente. Já está escrito no post como funciona, mas irei repetir…o arquivo thumbs.php retorna uma única imagem sendo preciso para isso passar a url da imagem! Abraços

Comentário por clares

Vai me ajudar no projeto final da escola :D

Comentário por daniel

Amigo não conseguir fazer funcionar,ao aparece uns quadradinhos….
como que o links das imagens tivesse errada;;;

Comentário por Osvaldo de SouzaTavares

Olá Osvaldo, é importante lembrar que o código acima está informando que os arquivos php e as imagens estão no mesmo diretório. Quero dizer, se suas imagens estão por ex: em um diretório separado (que seria o correto) então você deverá passar a urlDiretorio+nomeDaImagem. Por ex:
src=”thumb.php?img=diretorio/image1.jpg” , faça o download do arquivo e dê uma analisada.
Um grande abraço.

Obs: Pessoal atentem-se aos apóstofros/aspas … verifiquem se estão corretos.

Comentário por clares

Clares, esse sistema aceita gif e png também?

Comentário por Junior Campos

Olá Junior, O exemplo proposto não aceita e você pode ver isso na linha $image = imagecreatefromjpeg($filename), onde o comando está criando um jpeg.. Você pode ver como adaptar o exemplo em:

http://br.php.net/manual/pt_BR/function.imagecreatefrompng.php

http://br.php.net/manual/pt_BR/function.imagecreatefromgif.php

abraços

Comentário por clares

Olá, bons códigos, muito úteis!
Tenho uma dúvida, este comando gera uma miniatura da foto (thumbs), mas esta é um arquivo temporário?? ocupará espaço em meu servidor?? onde será salvo??

Obrigado, parabéns pelo código!

Comentário por Tiago

Ola Tiago, não ocupa espaço em disco, o que acontece é que não são criadas imagens pequenas mas isso já comentei no post. a imagem é apenas redimensionada em tempo de execução, tem seu tamanho e qualidade reduzidos ao ser “exibida”. Portanto não se preocupe pois elas não ficam em temp ou algo assim. Abraços

Comentário por Rafael Clares

Ola Rafael Clares, a muito tempo estava procurando um tutorial desses. Ficou muito bom. mais uma coisa q me deixou encucado, como faço pra ele redimencionar só o width e heigth fazer automaticamente???

obrigado

Comentário por Ewerton Cavaliere Muller

Olá Ewerton, amigo deixa eu ver se entendi a pergunta. Você quer mudar apenas a largura e manter a altura? Se for isso a altura original tem seu valor contido na variável $height. $new_height é a nova que determinamos. Obrigado pelo comentário. Abraços

Comentário por Rafael Clares

Olá …

Eu estou procurando por um exemplo desses usando PHP5 Orientado a Objeto, você programa em OO também?

Estou precisando aprender como separar as coisas, tenho que fazer um site com apenas uma foto miniatura na pagina inicial, como se eu pudesse definir a foto CAPA, e quando eu clicasse nessa foto abrisse a pagina com todas as fotos, pode até ser usando javascript ou ajax, para não precisar abrir outra pagina, apenas uma janelinha, mas isso deve ser mais complicado.

Sou iniciante PHP, li 2 livros ja, e estou aprendendo OO agora, e procurando ver exemplos como fazer as coisas.

Gostaria muito que me desse uma ajudinha se puder..

Abração! E parabéns pelo tutorial.

Comentário por Thiago

Legal Thiago, entendo o que você quer fazer, dê uma olhada nesse sisteminha que fiz.
http://clareslab.com.br/webimoveis/
olhe o painel administrativo em
http://clareslab.com.br/webimoveis/admin
Esse sistema está desatualizado neste endereço.
A nova última versão que contém algumas melhorias você pode ver em http://74.86.147.228/~webdemo/
mas nesse você não terá acesso ao painel admin, porém poderá ver algumas diferenças… de toda forma, entendo um pouco o que você quer… teste esse exemplo de forma que você entenda bem e depois nos falamos denovo para ver uma próxima etapa para você construir seu sistema ok. Abraços e muito obrigado pelo feedback.

Comentário por Rafael Clares

Cara!!! Muito obrigado mesmo! Fazia tempo que estava procurando algo pratico e objetivo assim para criar thumbs… O conteúdo do seu blog é muito bom, espero que continue assim. Vlw!

Comentário por Jackson

Clares, essa matéria é ótima, a melhor sobre o assunto que encontrei, particularmente falando.

Obrigado por isso e abraços

Comentário por Eliseu sb

Mto bom esse tutu veio, nao estava funcionando, entao baxei a que vc postou ali e funcionou, e quem quizer que ao clicar na imagem abra o arquivo original e numa nova aba coloque antes de <img src=

<a href=”caminho para a imagem original” target=_blank>

Comentário por Xupisco

Rafael, queria lhe dar os parabéns pelo excelente trabalho que você vem fazendo no seu blog, com excelentes post de facil entendimento e com contúdo super atrativos, obrigado mesmo, já está nos favoritos

Comentário por Raphael Azeredo

Valeu Rapha,
abraços

Comentário por Rafael Clares

Boa tarde Rafael, interessante seu “sisteminha” muito legal, podemos conversar sobre ele? por favor entre com contato com meu email.
Feliz Ano Novo a todos !!!!!!!
Obs. Não tenho corretora nem imobiliária.

Comentário por Paulo

Vlw cara gostei muito do codigo, estava precisando disso faz tempo.caso eu queira salvar a imagem thumb numa pasta como que faço….vlw

Comentário por Rodrigo Martins

Olá Rodrigo, para salvar a imagem altere a penultima linha do arquivo PHP
imagejpeg($image_p, null, 50);
troque o null pelo o caminho onde quer salvar a imagem ex:
imagejpeg($image_p, ‘/home/userx/images/img.jpg’, 50);

Comentário por Rafael Clares

Parabéns pelo post, o blog está excelente e isso ajudará a diminuir a taxa transferência do meu site, exibo miniaturas de programas e estará me ajudando muito este código, já que não encontrei informações sobre gd ou gd2.
Já testei offline e funcionou nos conformes. Agora vou integrar ao meu site e depois dar upload.
Obrigado! ;)

Comentário por Luiz Felipe

Olá, como eu comentei, o código funciona perfeitamente no que é proposto, mas eu notei que ao invés de diminuir meu bandwith, aumentou, isso ocorre porque toda vez ele visualiza a imagem, ela é baixada novamente. Não teria como o navegador imprimir a imagem uma vez e depois disso, toda vez que ele imprimir a imagem de novo, usar a do cachê, como seu eu usasse um link de imagem normal?
Mesmo eu tendo uma boa experiência com PHP, eu nunca mexi com imagens e não consegui fazer o que eu descrevo acima. =/
Ei, falando a respeito do EasyPHP, eu já tive alguns problemas com ele, atualmente eu uso o Vertrigo, julgo melhor e o utilizo.

Li o comentário que você fez sobre meu site, muito obrigado!

Comentário por Luiz Felipe

Testei apenas o desempenho em relação ao tempo de exibição das imagens, não posso afirmar que o que você descreve realmente ocorre por eu não ter testado, nem sei se o farei. Agora se quiser algo mais completo utilize a class thumbnail que possui uma gama maior de config. e também de efeitos como reflexo, watermark, etc… Quanto ao EasyPHP, nunca tive problema algum e continua sendo uma indicação, instalei uma vez e pronto… apenas o utilizo. Obrigado pelo comentário,

Comentário por Rafael Clares

Vlw pelo script ajudo muito no meu sistema t+
abraço

Comentário por Parrudinho

Não funciona comigo, não deve ser problema de código, mas alguém já viu este erro?
“Warning: getimagesize(foto.JPG) [function.getimagesize]: failed to open stream: No such file or directory in C:\www\site\sistema\carregafoto.php on line 26

Comentário por Moisés

O erro inicial, era que estava separando o nome do arquivo assim o código não sabia de onde estava vindo a imagem.
Solucionado esse erro, veio outro: imagecopyresampled(): supplied argument
Na verdade a foto sairá do pc do usuário e será salva na pasta thumb no servidor.
Inicialmente deverá gerar 2 imagens: 800 X 600 e 120 X 100 e salva-las com nomes destintos e depois serem salvos seus nomes no banco de dados.
Mas para o momento, preciso entender como funciona para carregar ao menos uma simples imagem redimensionada.
Anotei no código onde retorna o erro.

Grato;

$arquivi_nome = $_POST["max_foto"];
$filename = $arquivo_nome;
$percent = 0.10;
header(“Content-type: image/jpeg”);
list($width, $height) = getimagesize($filename);
$new_width = 120;
$new_height = 100;

$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);

//nesta linha da o seguinte erro:Warning imagecopyresampled(): supplied argument is not a valid Image resource
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

$pasta_dir = “thumb/”;//diretorio dos arquivos
$arquivo_nome = $pasta_dir . $arquivo["name"];

//arquivo_nome não está entrando
imagejpeg($image_p, $arquivo_nome , 50);
imagedestroy($image_p);

Comentário por Moisés

Moisés,

$arquivi_nome = $_POST['max_foto'] – onde está sendo usado ?
pq logo na linha abaixo vc diz $filename = $arquivo_nome;
acredito que $arquivi_nome e $arquivo_nome são difrentes, mas é isso mesmo?

Comentário por Rafael Clares

Rafael, show de bole este script.
Mas no meu para salvar a mini/thumb, não foi nem por reza….rs
Coloco como vc descreve e nada, deu permissão a pasta tb nada.
imagejpeg($image_p, ‘mini/teste.jpg/’, 50);

Abraços.

Adaysso

Comentário por Adilson

Pow Adilson, algo deve estar errado mesmo, acabei de testar aqui e gera normalmente a figura.
Pegando o mesmo script do exemplo alterei a linha para

imagejpeg($image_p, “thumbs/$filename”, 50);

Onde thumbs/ é o diretorio onde salvo a miniatura …. e $filename é nome original da imagem.
Obs: Se vai salvar a miniatura não esqueça que tem que alterar o local de onde serão exibidas as imagens depois.

De uma olhada aí em relação à diretório e também a forma como está passando o nome da imagem …

abs

Comentário por Rafael Clares

Só gerou uma única vez, sem a extenção da imagem ‘mini’.
Mas resolvi e funcionou para o que preciso, pois minhas imagens são gravadas no bd e é exibida apenas a primeira ex: thumb.php?img=fotos_anuncios/

Irei ver o que isso poderá ocasionar com o uso da banda, já que é gerado temporaria as thumbs para cada usuários no site, e se gerasse uma está principal, ficaria bem melhor.
Conseguir um script que faz isso, irei tentar adaptá-lo.

Valeu um forte abç.

Adaysso

Comentário por Adilson

Só não está funcionando no Chrome!
Obs: img- vem do formulário(input type=file)

Comentário por Moisés

Olá, Muito obrigado pela ajuda… estava precisando deste sisteminha… agora sem querer abusar, como faço para que as miniaturas reduzam proporcionalmente?

Comentário por Fernando Souza

Fernando, basta alterar as linhas abaixo:
$new_width = 120;
$new_height = 100;

alterando o valor fixo em pixels por valor percentual, ex:

$new_width = ($width / 5);
$new_height = ($height / 5);

Onde $new_width é a nova largura resultante da largura original ($width) dividido por 5 neste caso, como percebeu
o valor da nova largura não está fixo (120) e sim baseado na divisão do valor original dividido por 5 ($width/5)
Quero dizer que você pode explorar estas duas linhas para chegar ao resultado que deseja.

abraços,

Comentário por Rafael Clares

caro amigos estou com um problema no meu arquivo thumb.php ou sei la pois estou iniciando nessa de PHP exemplos – http://www.veiculossaopaulo.com.br/thumb.php?70prop2=70&arq=1069407089_CPA-5900_01.jpg
assim ele so me da a msg que a imagem nao foi encontrada …
e se eu mudar (por o nome da pasta uploads)
http://www.veiculossaopaulo.com.br/uploads/1069407089_CPA-5900_01.jpg ai abre a imagem do carro

aqui esta o thumb.php

<img src="”>

POR FAVOR ME AJUDEM POIS COMPREI ESSE SCRIPT DE UM SITE AI http://www.classicarro.noxweb.com.br/
E O CARA NUM TA NEM AI PRA MIM
OBRIGADO DESDE JA

Comentário por adriano

Adriano, por favor leia os comentários, a solução para o problema certamente já existe neles, sabe a versão de seu PHP?
até mais
obrigado pelo comentário

Comentário por Rafael Clares

descupa foi errado é http://www.veiculossaopaulo.com.br/thumb.rar

Comentário por adriano




Deixe um comentário
Linhas e parágrafos quebram automaticamente, endereços de email não serão mostrados, HTML permitido: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>