Publicidade   
 você está aqui: phpbrasil.com    artigos    artigo  
 
:: novos artigos ::

:: recomendado ::

Fundamentos de PHP

Compre esse livro no Submarino.com.br

:: publicidade ::


:: novos scripts ::

:: elenco phpbrasil ::

rafaelgh2005
Pontos: 3092

Visite a página de perfil de Mauricio WolffPHP + Imagens (Gerando thumbnails - imagens miniatura)
por Mauricio Wolff
Lista de Categorias  |  Contribua um Novo Artigo  |  Entre em Contato Conosco

Imagens grandes custam caro para o visitante (tempo) e para quem as publica (banda).

Neste artigo, se mostra como gerar thumbnails (miniaturas de imagens) com PHP, e se cria um arquivo que lista todas as imagens de um diretório.
Vote aqui!
Média de Votos Atual: 9.21
Total de Votos: 47
Nota:   

Intro
Um belo dia você acorda, toma um café preto e uma aspirina e decide colocar as fotos da festa de ontem na internet. Aquela, que fez você ter de tomar uma aspirina e o café preto.

Você tem na sua frente um bom editor de textos, um Apache com PHP, um browser e 60 fotos para botar no ar. Melhor fazer de uma vez, antes que a vontade passe.

Possibilidades
Para ser rápido, você pensa em botar as fotos uma em cima da outra, separadas por um <br />, e era isso. Mas aí você tem de aturar os amigos reclamando que a página demora um século para abrir e tem muita rolagem.

Também pode fazer o resize direto no HTML, forçando o IMG tag para 160x120px, e as suas fotos demorariam igual para carregar e ficariam com uma aparência pior que a sua neste momento.

A última maluquice seria fazer thumbnails (miniaturas) das fotos num editor gráfico, e criar um link para a foto em tamanho natural. Genial! Mas fazer thumbnails de 60 imagens??? E quando os outros mandarem as fotos deles para serem incluídas, você vai fazer tudo de novo? Larry Wall já disse que o bom programador é meio preguiçoso. "Faça bem feito para não ter de fazer de novo"

A Solução
Aí então, você lembra de, um dia, ter lido em algum lugar que o PHP trabalha com imagens.
Bem lembrado. Neste artigo você vai aprender a criar thumbnails em realtime com o PHP e a biblioteca GD.

Para isso tenha certeza de que o seu PHP foi compilado com suporte a GD 2.0.1 (no win32 é padrão. No *nix, --with-gd[=DIR]) e que ele está sendo carregado no PHP.INI. Se você está hospedando o seu site numa empresa de host, peça gentilmente para o admin habilitar o GD2 no PHP.INI. Não compromete em nada a performance do server e dá uma possibilidade a mais para os clientes.

O script vai receber a imagem da qual o thumbnail deve ser gerado pela querystring, com o endereço completo da imagem no servidor. Uma IMG tag vai ficar mais ou menos assim:


<img src="thumb.php?dir/imagem.jpg">


Explicações dadas, vamos ao que interessa: show me the code...

Código-Fonte


<!-- START arquivo thumb.php -->

<?PHP
/** Arquivo: thumb.php
  * Autor: Mauricio Wolff .:. organiKa
  * baseado no trabalho de Michael Bailey
***/

// Constantes: variaveis que não mudam em todo o programa
// path do win2k. no unix, mude de 'd:/path' para '/home/usuario/www'
define('PATH_IMG''d:/www/artigos/thumb');
define('MAX_WIDTH'160);
define('MAX_HEIGHT'120);

# Pega onde está a imagem
$image_file str_replace('..'''$_SERVER['QUERY_STRING']);
$image_path PATH_IMG '/' $image_file;

# Carrega a imagem
$img null;

$extensao strtolower(end(explode('.',$image_path)));

if (
$extensao == 'jpg' || $extensao == 'jpeg') {
    
$img = @imagecreatefromjpeg($image_path);
} else if (
$extensao == 'png') {
    
$img = @imagecreatefrompng($image_path);
    
// Se a versão do GD incluir suporte a GIF, mostra...
} elseif ($extensao == 'gif') {
    
$img = @imagecreatefromgif($image_path);
}

// Se a imagem foi carregada com sucesso, testa o tamanho da mesma
if ($img) {
    
// Pega o tamanho da imagem e proporção de resize
    
$width imagesx($img);
    
$height imagesy($img);
    
$scale min(MAX_WIDTH/$widthMAX_HEIGHT/$height);

    
// Se a imagem é maior que o permitido, encolhe ela!
    
if ($scale 1) {
        
$new_width floor($scale $width);
        
$new_height floor($scale $height);
        
// Cria uma imagem temporária
        
$tmp_img imagecreatetruecolor($new_width$new_height);
        
// Copia e resize a imagem velha na nova
        
imagecopyresized($tmp_img$img0000$new_width$new_height$width$height);
        
imagedestroy($img);
        
$img $tmp_img;
    }
}

// Cria uma imagem de erro se necessário
if (!$img) {
    
$img imagecreate(MAX_WIDTHMAX_HEIGHT);
    
imagecolorallocate($img204204204);
    
$c imagecolorallocate($img153153153);
    
$c1 imagecolorallocate($img000);
    
imageline($img00MAX_WIDTHMAX_HEIGHT$c);
    
imageline($imgMAX_WIDTH00MAX_HEIGHT$c);
    
imagestring($img21255'erro ao carregar imagem'$c1);
}

// Mostra a imagem
header('Content-type: image/jpeg');
imagejpeg($img);
?>
<!-- END arquivo thumb.php -->


Comentários
Agora que você já saciou a sede de código, prepare uma xícara de café (ou JoltCola... eu nunca tomei, não posso falar) e vamos analisar o código como faria Jack, por partes...


<?php
// Constantes: variaveis que não mudam em todo o programa
// path do win2k. no unix, mude de 'd:/path' para '/home/usuario/www'
define('PATH_IMG''d:/www/artigos/thumb');
define('MAX_WIDTH'160);
define('MAX_HEIGHT'120);
?>


Primeiro, a definição de algumas constantes. "PATH_IMG" aponta para o diretório onde estãos os arquivos de imagem no servidor. "Apenas imagens neste ou nos seus subdiretórios serão mostradas". Não é um primor de segurança, mas funciona muito bem.

MAX_WIDTH e MAX_HEIGHT definem o tamanho máximo em pixels para os thumbnails. Se a imagem já possuir um tamanho menor que estes, ela não é alterada. Proporções serão mantidas, pois se a largura (width) for reduzida por 3, a altura (height) será reduzida na mesma razão.


<?php
# Pega onde está a imagem
$image_file str_replace('..'''$_SERVER['QUERY_STRING']);
$image_path PATH_IMG '/' $image_file;

# Carrega a imagem
$img null;

$extensao strtolower(end(explode('.',$image_path)));

if (
$extensao == 'jpg' || $extensao == 'jpeg') {
    
$img = @imagecreatefromjpeg($image_path);
} else if (
$extensao == 'png') {
    
$img = @imagecreatefrompng($image_path);
    
// Se a versão do GD incluir suporte a GIF, mostra...
} elseif ($extensao == 'gif') {
    
$img = @imagecreatefromgif($image_path);
}
?>


O local físico da imagem é passada na query string, como explicado nos comentários. Para prever o acesso de imagens fora do local especificado na constante, quaisquer ".." são suprimidos da query string, e ½ dos "h4x0rs" eliminados ($image_file = str_replace('..', '', $_SERVER['QUERY_STRING']);)

Em seguida, a extensão do arquivo é checada para se definir qual função do GD será usada para a imagem em questão. O GD pode criar imagens a partir de: "gif, jpeg, png, wbmp, xbm, xpm"... etc. Neste script você vai encontrar suporte para "gif, jpeg e png", e isso deve bastar. Caso precise acrescentar, ponha mais um elseif e resolvido!

Se a extensão não for reconhecida ou o arquivo não existir, a variável $img vai ficar vazio e isso vai gerar um erro. O @ antes das funções previne que erros sejam mostrados se a função imagecreatefrom... não conseguir criar a imagem. Essa mesma técnica pode ser usada em extract, se o argumento passado não for um array.

Se você tentar utilizar este script para gerar o thumbnail de um ".gif" e obtiver o erro:
"Warning: ImageCreateFromGif: No GIF read support in this PHP build"
Não se desespere! Isso acontece porque na versão 1.6 o GD deixou de oferecer suporte a .gif, já que a dona Unisys tem a patente do algoritmo de compressão usado nos gifs e quer $$$ por isso.

Existem várias alternativas para contornar este problema. Em distribuições Linux como o Debian você pode baixar pacotes RPM do GD patched, você mesmo pode aplicar o patch no gd.c, baixar patches na internet (tente http://www.webofsin.com/gd-1.8.3-gif.patch">http://www.webofsin.com/gd-1.8.3-gif.patch) ou usar programas externos para converter os ".gifs em .pngs" (gif2png, mogrify, ImageMagick, netPBM).


<?php
// Se a imagem foi carregada com sucesso, testa o tamanho da mesma
if ($img) {
    
// Pega o tamanho da imagem e proporção de resize
    
$width imagesx($img);
    
$height imagesy($img);
    
$scale min(MAX_WIDTH/$widthMAX_HEIGHT/$height);
?>


imagesx() e imagesy() retornam a largura e altura da imagem respectivamente. A proporção de redimensionamento é obtida com o "tamanho máximo permitido" dividido pelo "tamanho real" da imagem. Ele é calculado para a largura (width) e altura (height), mas somente o menor valor deles é usado. Usando a mesma razão para altura e largura, a proporção é mantida.


<?php
// Se a imagem é maior que o permitido, encolhe ela!
    
if ($scale 1) {
        
$new_width floor($scale $width);
        
$new_height floor($scale $height);
        
// Cria uma imagem temporária
        
$tmp_img imagecreatetruecolor($new_width$new_height);
        
// Copia e resize a imagem velha na nova
        
imagecopyresized($tmp_img$img0000$new_width$new_height$width$height);
        
imagedestroy($img);
        
$img $tmp_img;
    }
}
?>


Se a proporção de redimensionamento ($scale) for maior ou igual a 1, a imagem não precisa ser alterada, já é menor que um thumbnail. Caso contrário, a imagem precisa ser reduzida na razão da variável "$scale". O tamanho do thumbnail é calculado "multiplicando-se o tamanho real da imagem pelo valor de $scale".

Usando esses valores de largura e altura, criamos uma nova imagem temporária usando a função "imagecreatetruecolor()". Se você não estiver usando GD 2.0+, use a função "imagecreate()" (os seus jpegs podem ficar medonhos, use 2.0+).

A imagem original vai agora ser redimensionada para o tamanho da temporária. Podemos então liberar o arquivo da imagem e renomear a temporária para "$img".


<?php
// Cria uma imagem de erro se necessário
if (!$img) {
    
$img imagecreate(MAX_WIDTHMAX_HEIGHT);
    
imagecolorallocate($img204204204);
    
$c imagecolorallocate($img153153153);
    
$c1 imagecolorallocate($img000);
    
imageline($img00MAX_WIDTHMAX_HEIGHT$c);
    
imageline($imgMAX_WIDTH00MAX_HEIGHT$c);
    
imagestring($img21255'erro ao carregar imagem'$c1);
}
?>


Se a extensão não for reconhecida ou o arquivo não for encontrado, uma imagem de erro será gerada. Ela será um quadrado cinza com um X cinza o cortando e a frase 'erro ao carregar a imagem' em preto, mas também pode ser uma imagem de erro previamente criada.

A função "imagestring" escreve texto na imagem. Os seus parâmetros, apesar de não parecerem fazer sentido algum, são muito fáceis de entender. Em ordem: "$img" é a imagem na qual a string será escrita (handle); "2" é o tamanho da letra, variando de 1 a 5; "12" é a coordenada x da base esquerda da string, enquanto que "55" corresponde à base inferior; 'erro ao carregar a imagem' - surpresa!!! - é a string em si, que será escrita; "$c1" é a cor alocada para s string, definida logo acima, em RGB.


<?php
// Mostra a imagem
header('Content-type: image/jpeg');
imagejpeg($img);
?>


Finalmente, mostra a imagem. Pode ser usado o parâmetro opcional "int(quality)" da função "imagejpeg", para controlar a qualidade da imagem mostrada. O parâmetro varia de 0 a 100, sendo o seu default "75".

E a imagem grande?

Como você pode ver, nem é preciso tanta cafeína assim para gerar thumbnails em PHP. Agora, só falta o gran-finale do artigo: e como linkar as imagens em tamanho natural?

para isso precisaremos de:

  1. uma página listando as imagens de um diretório

  2. algumas imagens maiores que 160x120px

  3. um pouco de xhtml e css



Listando as imagens
A nossa aventura termina com uma página xhtml simples, com código PHP embutido, que lerá as imagens do diretório padrão de imagens e mostrará uma lista de thumbnails.


<!doctype html public "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>.: Lista Imagens :.</title>
<meta name="author" content="mauricio wolff :aka: mauwolff" />

<style type="text/css" media="all">
<!--
body, p { font-family: arial, sans-serif; font-size: 12px; }
image&nbsp;&nbsp;&nbsp;{ border: 0; display: block; clear: both; margin: 15px; text-align: center;}
-->
</style>
</head>

<body>
<?php 
// Abre o diretório atual para leitura de imagens...
if ($handle opendir('.')) { 
    while (
false !== ($file readdir($handle))) { 
    
// Só carrega as imagens que tiverem extensões esperadas
    
if (strtolower(substr($file, -44)) == '.jpg' || strtolower(substr($file, -44)) == '.gif' || strtolower(substr($file, -44)) == '.png' || strtolower(substr($file, -55)) == '.jpeg') { 
        
$alt 'clique para ver a imagem no tamanho original...';
        echo 
'<a href="'.$file.'" target="_blank"><img src="thumb.php?'.$file.'" alt="'.$alt.'" /></a>'."\n"
    }

closedir($handle); 

?>
</body>
</html>


Simples, não? O css define a apresentação do xhtml, que somente terá uma lista de thumbnails a mostrar. As imagens automaticamente não terão borda alguma, estarão centralizadas na página e serão listadas uma abaixo a outra. Com CSS isso é facilmente alterável, sem mexer no html ou usar gambiarras como "<br />".

O código php somente abre o diretório atual, lista todos os arquivos do tipo desejado e monta os links para as imagens grandes. Se você criar um arquivo de texto vazio e renomeá-lo para "teste.gif", verá a imagem de erro.

Para você ter uma idéia da economia: um arquivo de "18.809 bytes" ficou com "2.941 bytes", e outro de "287.005 bytes" ficou com "3.257 bytes" (1,13% do tamanho).


Conclusão

Claro que, normalmente, é melhor usar uma classe de template, deixar o seu código mais modular, não misturar apresentação e lógica... mas este é um exemplo funcional do que se pode fazer com meia-dúzia de linhas e algumas fotos...

Bom... já foi um exercício. Agora aproveite os exemplos, refine um pouco o código e, depois de botar as fotos da festa no ar, volte pra cama. Aproveite a ressaca...

base64: SGFwcHkgY29kaW5nIQ==

Sobre o autor
Mauricio Wolff é o fundador, criador, programador e fazedor de cafézinho da http://www.organiKa.com.br">organiKa.com.br. Gosta de PHP, XML, CSS, Sânscrito, Vedanta, Cinema, Artes, Kung-Fu, Física e História. Sim, ele gosta de bastante coisa... é casado e tem uma filha.


<< Anterior 1 Próxima >>

 
Imprimir  |  Enviar para um Amigo


Comentários de Usuários

Me ajuda!!!! :(
publicado por Fernando Lopes - 2004-06-07 08:00:09

Cara, eu só fiz dá um ctrl+c e ctrl+v para o phpeditor e joguei o código pro server... mais quem desse que apareceu o tumb...
A imagem , quando eu clico no link até aparece, mais o tumb não apareceu.
Será que é pela versão do GD que eu tenho instalado (1.6.2 or higher)?

Me dê alguma dica de qual pode ser o problema!!!
Valeu...
Fernando Cruz


Tambem nao funcionou
publicado por Joaquim José da Silva Xavier - 2004-06-07 13:38:27

Comigo tambem nao aparece as miniaturas... eu mudei estas linhas

// Abre o diretório atual para leitura de imagens...
if ($handle = opendir('images')) {

Alguém ai....dê uma luz...
publicado por Fernando Lopes - 2004-06-08 09:13:20

Alguém ai dê uma luz por favor...faz muito tempo que procuro algo assim...e quando acho não está funcionando... :-(

Como uma luva!!
publicado por prk_83 - 2004-06-08 14:28:43

Mauricio,

Este artigo caiu como uma luva.
Logo hoje precisei fazer uma galeria de imagens. Cada imagem teria 150 KB e com os thumbs cada uma fica com 5 KB.

Isso agilizou muito na hora de carregar a página.

Muito bom o artigo!

Paulo Kun

Perfeito Cara
publicado por Samuel Sousa Santos - 2004-06-08 22:45:02

Olá Mauricio!
O seu artigo foi ótimo, muit bem explicado. Quanto ao código: foi só copiar e colar que já estava funcionando. Essa função vai ser muito útil pra mim, pois estou fazendo um site onde tenho que colocar uma grande quantidade de fotos. E cá pra nós! É um saco gerar tumbs pra todas as fotos.
Parabens!

copiar e colar...
publicado por Mauricio Wolff - 2004-06-09 09:38:21

Fernando, uma coisa muito estranha que já em aconteceu foi tentar copiar e colar código do Opera para o notepad e não funcionar nada. Fazer a mesma coisa do msie e funcionar direto.

Outra coisa que pode estar acontecendo é a versão do GD. Distribuições recentes do linux já vem com "GD Version bundled (2.0.17 compatible)", que facilita a tua vida em 2.000%. Se colar do exploder não funcionar, experimenta em outro server, ou diz pro teu root atualizar a bagaça; :)

ah... obrigado.
publicado por Mauricio Wolff - 2004-06-09 09:43:25

aos que conseguiram e foi útil, o meu obrigado. :)

repeticao de assunto
publicado por Off - 2004-06-10 07:24:59

Já havia um artigo feito sobre esse assunto, http://phpbrasil.com/articles/article.php/id/204

A parte de pegar todas as fotos ficou legal

parabens!

AJUDA
publicado por Joaquim José da Silva Xavier - 2004-06-10 10:19:17

No phpinfo() diz que:

GD Version bundled (2.0.15 compatible)

será que é por isso que as imagens não são criadas?

so tá aparecendo aquele X, o codigo HTML é gerado mas as miniaturas não

por favor, me responda, valeu

Dúvida
publicado por Guntz - 2004-06-10 19:55:33

Gostei muito do código, bem simples e fácil.
Porém ocorreu um erro que foi comum aqui, os thumbnails não apareceram :(
To usando o EasyPHP 1.7 e pelo que vi ele vem com a GD e já habilitei ela no php.ini, mas na hora que é pra ver os thumb só aparecem os quadrados com X.

Demora
publicado por dcerutti - 2004-06-15 16:54:39

Utilizo um código de raciocínio semelhante, porém o servidor demora para devolver a imagem. E não é uma imagem grande, ela fica em torno de 30Kb. Teria alguma coisa para solucionar isto.
Utilizo servidor da HostNET.

Alguém me ajuda....
publicado por Francisco Victor M. M. Calvet - 2004-06-15 18:08:50

Essa foi minha mensagem de erro:

Warning: Cannot add header information - headers already sent by (output started at c:\phpdev\www\thumb\thumb.php:3) in c:\phpdev\www\thumb\thumb.php on line 65

Já tentei de tudo...nada consegui...
A versão do meu GD é 2.0 or higher!

Re: Alguém me ajuda....
publicado por 404error - 2004-06-16 19:14:45

Francisco, isso acontece porque, provavelmente, você tem alguma saída de dados antes da função header().

Qualquer saída de dados [seja um código HTML, um echo, um comando pra impressora e etc] fecha a header e ela não podem ser alterada sem que a página seja recarregada...

Verifica aí no seu código se não está acontecendo isso, se for esse o caso, é só remanejar as saídas de dados pra depois do envio da header que deve funcionar normalmente... =]

Me ajudem por favor
publicado por Antonio Marcos P. Almeida - 2004-06-19 22:11:09

Mauricio muito bom esse artigo.
Cara eu copiei todo o código, gerei os arquivos, os link até aparecem, mais o tumb não, estou utilizando o GD bundled (2.0.23 compatible), já tentei rodar com o easyPHP também não deu, por favor me ajude... valew

Só vc pode me ajudar...
publicado por Francisco Victor M. M. Calvet - 2004-06-20 13:46:01

Estou começando a estudar PHP...daí olhei esse teu artigo e achei super massa...só que nunca consegui executá-lo!
Essa é minha mensagem de erro no thumb.php:

Warning: Cannot add header information - headers already sent by (output started at c:\phpdev\www\thumb\thumb.php:3) in c:\phpdev\www\thumb\thumb.php on line 65

E a linha 65 é:
header('Content-type: image/jpeg');
Já o meu arquivo para listar as imagens..que eu chamei de imagens.php mostra os espaços certos para os thumbs mas não mostra as imagens...

Por favor me ajude!

thumbs com segurança
publicado por cesarps - 2004-06-28 09:08:00

Olá
Fiz um sistema semelhante para geração de thumbnails, onde o proprio arquivo original gera o thumb, modificando apenas seu tamanho. Mas o que está pegando agora é a segurança deste sistema. Ele esta hospedado na minha conta particular do servidor de e-mail da minha empresa. Meu objetivo é distribuir este sistema para outros usuarios, numa conta particular (apenas para este fim) ou na conta de cada usuario. Bem, o problema é: As imagens são apenas inseridas ou mostradas quando o diretório de imagens está configurado como 777 (o proprietário, o grupo e todos lêem, escrevem e executam), o que torna este sistema muito vulnerável. Eu gostaria de saber se há algum meio óu existe algum sistema semelhante, mas seguro. Obrigado Cesar

Código Perfeito (Like a glove)
publicado por Leonardo Todeschini - 2004-07-08 10:22:39

Mauricio,

o seu artigo me caiu como uma luva, funcionou muito bem e pode ter certeza que nos créditos do projeto de comércio eletrônico que minha equipe está trabalhando aparecerá seu nome como um grande colaborador (merecidos créditos digno de passagem). Só estou enviando esta mensagem para agradecer mesmo.. funcionou perfeitamente.. li alguns relatos de problema acima e percebo que algumas pessoas podem não ter editado o arquivo php.ini e habilitado a extensão gd.. outras que tem problemas com a função header, certamente tem código antes da tag de abertura de script "<?"..

Fica meu abraço.. e meus agradecimentos!

Aos que estão com problemas
publicado por Massa - 2004-07-09 14:39:44

O Código acima é perfeito , porém existe um "problema" na relação entre o código thumb.php e a página xhtml simples

A página xhtml simples foi concebida para abrir as imagens que estão no mesmo diretório através da instrução:

if ($handle = opendir('.')) {

assim como tb. faz a chamada do thumb.php pressupondo a mesma coisa:

<img src="thumb.php?'.$file.'" alt="'.$alt.'" />

Isso conflita com o Script thumb.php que no seu inicio preve 'PATH_IMG' como o caminho ao diretório das imágens. e possui em seu código , a seguinte linha:

$image_path = PATH_IMG . '/' . $image_file;

Se ambos estão (thumb.php e a página xhtml simples) no mesmo diretório das imágens , a linha acima informará um caminho incorreto a localização das imagens.

Dica:
Coloque os dois (thumb.php e a página xhtml simples que faz a chamada) no mesmo diretório das imagens que pretende exibir , e faça a seguinte alteração no código:

Apague esta linha
$image_path = PATH_IMG . '/' . $image_file;

insira esta no mesmo local
$image_path = $image_file;

pois se vc optar por fazer :
define('PATH_IMG', '');
ainda havera a saida de uma '/' em:
$image_path = PATH_IMG . '/' . $image_file;
o que levara o script a mostrar o famoso X

Parabéns ao Mauricio pelo excelente código

Problemas com o header
publicado por Thiago Drechsel - 2004-07-13 13:13:02

Ola pessoal!

Ja tentei de tudo para retirar o erro de Warning: Cannot add header information - headers already sent by....

Copiei e colei os codigos mas continuo somente recebendo o erro acima!
O que esta errado??

Abraco!

Resolvi
publicado por Thiago Drechsel - 2004-07-13 13:30:06

Pessoal, ja resolvi o meu problema!

O problema e no thumb.php

Nao pode haver nada antes da abertura do script. Nem mesmo espaco ou nova linha!!
Se vc copiar e colar o script dessa pagina:

<!-- START arquivo thumb.php -->

<?PHP

existe uma linha antes da abertura do script. Isso vai causar o erro!
Tirei esse trecho e funcionou bem!

DICA: Se vc quiser ter certeza do erro que esta ocorrendo, basta colocar no navegador:

http://endereco_do_servidor/thumb.php?nome_do_arquivo.jpg

Assim vc acessa direto a pagina e recebe o erro. Fica mais facil descobrir o que esta acontecendo!

Um abraco e parabens pelo artigo!

Nomes com espacos
publicado por janjao - 2004-07-16 11:05:45

A funcao de imagecreate() nao funciona com nomes com espaços? Tem como fazer? Tenho 5000 imagen e teria que renomear todas. J´´a fiz o replace do espaço pelo codigo asc mas nao resolveu.
ex. do nome: imagem (0).jpg
Alguma dica, alem de renomear?

Re: Nomes com espacos
publicado por Mauricio Wolff - 2004-07-22 20:16:34

Podes tentar substituir espaços por %20, ou podes usar um programinha como o ACDSee para renomear todas as imagens tomáticamente...

na primeira sugestão: imagem%20(0).jpg

não testado.

Outra: desculpem o comentário antse do início do arquivo. vacilo pra deixar o código bonito pra cá. :)

Atenção
publicado por robson_mello - 2004-12-22 07:08:13

Funcionou perfeitamente, parabéns pelo excelente script. Muita atenção no php.ini, é necessário descomentar a dll referente ao GD. Meu script ficou exatamente assim...

<!doctype html public "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>.: Lista Imagens :.</title>
<meta name="author" content="mauricio wolff :aka: mauwolff" />

<style type="text/css" media="all">
<!--
body, p { font-family: arial, sans-serif; font-size: 12px; }
image&nbsp;&nbsp;&nbsp;{ border: 0; display: block; clear: both; margin: 15px; text-align: center;}
-->
</style>
</head>

<body>
<?php
// Abre o diretório atual para leitura de imagens...
if ($handle = opendir('images')) {
while (false !== ($file = readdir($handle))) {
// Só carrega as imagens que tiverem extensões esperadas
if (strtolower(substr($file, -4, 4)) == '.jpg' || strtolower(substr($file, -4, 4)) == '.gif' || strtolower(substr($file, -4, 4)) == '.png' || strtolower(substr($file, -5, 5)) == '.jpeg') {
$alt = 'clique para ver a imagem no tamanho original...';
echo '<a href="'.$file.'" target="_blank"><img src="thumb.php?'.$file.'" alt="'.$alt.'" /></a>'."\n";
}
}
closedir($handle);
}
?>
</body>
</html>
--------------------------------------------
<?PHP
/** Arquivo: thumb.php
* Autor: Mauricio Wolff .:. organiKa
* baseado no trabalho de Michael Bailey
***/

// Constantes: variaveis que não mudam em todo o programa
// path do win2k. no unix, mude de 'd:/path' para '/home/usuario/www'
define('PATH_IMG', 'images');
define('MAX_WIDTH', 160);
define('MAX_HEIGHT', 120);

# Pega onde está a imagem
$image_file = str_replace('..', '', $_SERVER['QUERY_STRING']);
#$image_path = $image_file;

$image_path = PATH_IMG . '/' . $image_file;

# Carrega a imagem
$img = null;

$extensao = strtolower(end(explode('.',$image_path)));

if ($extensao == 'jpg' || $extensao == 'jpeg') {
$img = @imagecreatefromjpeg($image_path);
} else if ($extensao == 'png') {
$img = @imagecreatefrompng($image_path);
// Se a versão do GD incluir suporte a GIF, mostra...
} elseif ($extensao == 'gif') {
$img = @imagecreatefromgif($image_path);
}

// Se a imagem foi carregada com sucesso, testa o tamanho da mesma
if ($img) {
// Pega o tamanho da imagem e proporção de resize
$width = imagesx($img);
$height = imagesy($img);
$scale = min(MAX_WIDTH/$width, MAX_HEIGHT/$height);

// Se a imagem é maior que o permitido, encolhe ela!
if ($scale < 1) {
$new_width = floor($scale * $width);
$new_height = floor($scale * $height);
// Cria uma imagem temporária
$tmp_img = imagecreatetruecolor($new_width, $new_height);
// Copia e resize a imagem velha na nova
imagecopyresized($tmp_img, $img, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
imagedestroy($img);
$img = $tmp_img;
}
}

// Cria uma imagem de erro se necessário
if (!$img) {
$img = imagecreate(MAX_WIDTH, MAX_HEIGHT);
imagecolorallocate($img, 204, 204, 204);
$c = imagecolorallocate($img, 153, 153, 153);
$c1 = imagecolorallocate($img, 0, 0, 0);
imageline($img, 0, 0, MAX_WIDTH, MAX_HEIGHT, $c);
imageline($img, MAX_WIDTH, 0, 0, MAX_HEIGHT, $c);
imagestring($img, 2, 12, 55, 'erro ao carregar imagem', $c1);
}

// Mostra a imagem
header('Content-type: image/jpeg');
imagejpeg($img);
?>
Atenção também na estrutura dos diretórios no servidor. []'Robson Mello

Um pequeno problema
publicado por nirsu_php - 2005-01-28 12:23:17

Seguinte, curti muito o script e é exatamente o que estava procurando porém, com esse script tenho o seguinte problema. No PATH_IMG onde especifico o caminho onde estão as imagens, no meu caso necessito que ele seje dinamico, ou seja, minhas imagens não fica em apenas uma pasta e sim em várias pastas. Apenas para entender,no cadastro de anuncio, posso incluir até 3 fotos. Ao fazer o Upload ele cria uma pasta com o ID do anuncio dentro da pasta images_anuncio, ou seja, supondo anuncio id 01, vou ter : images_anuncio/01/foto01.jpg

Não consegui modificar o script para que esse caminho seje dinamico.

Alguem teria a solução ?? Maurício ?

IMG_PATH dinâmico...
publicado por Mauricio Wolff - 2005-01-28 12:50:44

æ nirsu_php...

podes definir o IMG_PATH baseado no input o usuário, fazer um select no banner, etc.

ao invés de
define('PATH_IMG', 'images_anuncio');
$image_path = PATH_IMG . '/'. $id_anuncio .'/'. $image_file;

ou algo assim... pegou?

Re: IMG_PATH dinâmico...
publicado por nirsu_php - 2005-01-29 10:35:09

Ja tentei passando por parametro, com session, mas no seu script ele não pega nada, nenhuma var. Ja tentei fazer o seguinte, no nome do arquivo tb colocar o ID do anuncio, ex.: 01_foto01.jpg ai no seu script fazer talvez um explode para pegar esse ID.

Mas não consegui pegar o nome do arquivo no script.

Tem alguma solução ?

Re: Re: IMG_PATH dinâmico...
publicado por nirsu_php - 2005-01-29 11:28:36

Conseguiiiiiiii.........

Quando gero o nome dos arquivos das imagens, coloco tb o ID do anuncio, ficando por ex.: 1_foto1.jpg, 2_foto1.jpg, deste modo consigo pegar o ID do anuncio, fazendo com que ele pegue a imgem na pasta correta.

Segue as alterações que fiz:

$id = explode('_', $image_file);
$PATH_IMG = "/home/botinas/public_html/projeto/RAMSHOP/images_anuncio/";
$PATH_IMG .= $id[0];

Valeu pelas ajudas, e muito bom esse script.
Parabens

funcionou certinho
publicado por JustuS - 2005-02-11 13:58:37

mto bom!
fiz uma adaptação do código pra gerar o thumbnail no momento em que envio uma imagem, e salva esse thumbnail no diretório....aí eu soh gero uma vez ele e depois soh chamo na hora de mostrar.....
mas esse artigo foi muuuito útil..! valeu!

Um pequeno problema
publicado por nirsu_php - 2005-03-15 17:40:20

E quando eu tento fazer o teste como foi citado acima e nada acontece:

www.endereco.com.br/thumb.php?imagem.php

Não está aparecendo nada e nenhum erro. Oq pode ser ????
Se dou um echo nas var, ta tudo certo....

Boaaaa!
publicado por tkramer - 2005-09-13 08:59:15

simples fácil e perfeito! Parabéns! Vai me ajudar bastante!

duvida
publicado por Matheus Poletto - 2005-10-25 12:39:20

O script eh mto bom!!! Esta ajudando a resolver o meu problema, mas...:

Como eu faco pra salvar esse novo Thubm em uma pasta desejada???

Gratoooo

revisão de código...
publicado por Mauricio Wolff - 2005-10-25 16:38:45

opa

vivendo e aprendendo, certo? já se passou muito tempo desde a publicação deste, e já faço muitas coisas diferentes. Algumas delas não invalidam o artigo, como o fato de usar uma classe que faz isso e mais, outras impactam não só a performance como o resultado final. Então vou colocar essas alterações no próximo comentário, e o código-fonte alterado em http://www.mauwolff.com.br/php/thumb2.phps

Um grande abraço a quem utilizou este artigo e foi útil, e quem teve problemas... tem de se ligar!!! :)

alterações
publicado por Mauricio Wolff - 2005-10-25 16:51:39

$sImagem = @file_get_contents($imagem);
com isso pego a imagem e carrego para a var sImagem. Assim posso usar
$img = @imagecreatefromstring($sImagem), poupando o case que testava as extensões de arquivo. imagecreatefromstring detecta todos os tipos conhecidos, se ele não achar é porque daria erro mesmo.

cache
se já existir o arquivo thm_NOMEARQUIVO.EXT no diretório padrão, ele mostra esse thumbnail e termina o programa. Havia feito o artigo só didático, mas como tem gente usando direto, assim poupamos processadores.

imagecopyresampled
Na primeira versão usava imagecopyresized, que deixa os thumbs maiores e mais feios. Aprendizado com a vida, agora só uso resampled.

if(!empty($imagemQs) && @file_exists($imagem)){
isso testa a existência do arquivo a ser redimensionado e que não veio a QueryString vazia. Se não fosse assim, iria criar arquivos adoidado no diretório.

Acho que foi só. Espero que continue sendo útil.

Abração

mauwolff

conseguii!!!!
publicado por jaimewillian - 2005-10-31 10:59:41

Ola pessoal...deu certo aki....mais os thumbs ficaram com uma pessima qualidade...queria saber se tem como aumentar um pouco a qualidade delas...

obrigado...e valeu pela ajuda!!

mais uma coisa
publicado por jaimewillian - 2005-10-31 12:57:27

Galera qdo eu abro a página...ele aparece a imagem de erro....queria que ele ja abrisse a 1º foto do diretorio......Mais no resto ta perfeito!!

alguem pode ajudar?
abraço!

Exelente
publicado por Itiberê E. Souza Mattos - 2005-11-12 06:25:47

Muito bom meu amigo , faz tempo que eu tava procurando um script assim, facil, eficente e bonito.
legal

Problema
publicado por erijpc - 2005-12-21 06:43:27

Não está gerando a imagem menor e também não Consigo Visualizar as Imagens. Só Consigo ver quando digito o caminho do arquivo.

exemplo:http://localhost/meudiretorio/meuarquivo.php?nome_da_imagem.jpg.

Se não for assim aparece apenas a imagem erro ao carregar imagem.AJUDA.

Qualidade
publicado por Hugo Nogueira - 2006-03-03 12:51:05

Para ficar com maior qualidade, use: imagecopyresampled(); no lugar de imagecopyresized();.

Abraços...

hugo@hugonogueira.com

Classe para geração de thumb e redimensionamentos
publicado por Alfred R. Baudisch - 2006-03-05 12:59:43

Tenho uma classe publicada que faz o trabalho completo de redimensionamento (geração de thumbnails) para JPG, PNG e/ou GIF: http://www.phpbrasil.com/scripts/script.php/id/1451

Novas versões... pouca mudança porém valiosa...
publicado por Mauricio Wolff - 2006-06-01 05:33:16

refiz o código, por favor baixe as novas versões em:

http://www.mauwolff.com.br/php/thumb2.phps
http://www.mauwolff.com.br/php/index_thumb2.phps

e podes testar em:
http://www.mauwolff.com.br/php/index_thumb2.php

Um dia posto aqui a classe que uso atualmente. Mas para aprendizado, acho que é melhor entender o que a classe faz, assim vc pode criar a sua própria.

Grato!

Mauricio Wolff

Bom artigo
publicado por dcomp - 2006-06-08 15:13:09

bom artigo, havia feito algo semelhante. o problema é que o usuário fica sem o thumbnail em cache, ou seja: toda vez que ele voltar para a pagina, o browser carrega o thumbnail novamente.

Valeu
publicado por Chimunthu - 2006-07-12 16:58:55

Ei realmente valeu a dica, estou começando no php espero que encontr ajuda com todos vcs.

Exibição das imagens
publicado por jorge lopes - 2006-10-30 02:04:15

pessoal, gostaria de tirar uma dívida, as imagens irão aparecer uma embaixo da outra? se sim, é possível colocar em coluna de 4 por exemplo?

centralizar
publicado por Bruno Thadeu Alvim Guedes - 2007-03-14 13:06:54

Gostaria de centralizar a imagem nesse thumb. Não estou conseguindo.

pequeno probleminha.
publicado por psicoppardo - 2007-03-26 08:59:28

cara tudo correu certinho, só tem um probleminha, quando clico na imagem, ela não redireciona para o endereço correto ocasionando o seguinte erro:
Objeto não encontrado!

A URL requisitada não foi encontrada neste servidor. O link na página referida parece estar com algum erro ou desatualizado. Por favor informe o autor desta página sobre o erro.

Se você acredita ter encontrado um problema no servidor, por favor entre em contato com o webmaster.
Error 404
localhost
03/26/07 12:58:24
Apache/2.2.2 (Win32) DAV/2 mod_ssl/2.2.2 OpenSSL/0.9.8b mod_autoindex_color PHP/5.1.4

se alguém puder me ajudar agradeço.

mais só em fazer os thumbs já fiquei satisfeito ótimo tuto, valeu mesmo.

Só funciona com imagens de determinado tamanho
publicado por semmerket - 2008-03-14 11:59:18

Testei e está funcionando, exceto com imagens maiores. Tenho um sistema onde o cliente publica fotos direto da câmera digital e às vezes as fotos estão em 2000 pixels ou mais de largura. Essas imagens parecem não funcionar no script.

Vocês sabem se é algum erro do script ou é alguma limitação do GD2 ou mesmo do servidor?

Publique os seus Comentários

Nome:
Email:
Título:
Comentário:

NOTA: Cadastre-se no site para poder publicar comentários.

 
webmaster: João Prado Maia   © 2000 - 2005 phpbrasil.com
Gerado em 2.051 segundos