Upload de imagens com criação de thumbnails em PHP

Artigo que aborda o processo de upload de imagens em PHP com a criação de thumbnails, que são imagens de tamanho reduzido, em diretórios separados.

[ Hits: 71.066 ]

Por: Luís Fred em 04/10/2008


Upload (função para redimensionar as imagens)



func_upload.php

Este script se encarregará de criar uma cópia redimensionada da imagem original, ou seja, é ele que criará nossas imagens menores, as thumbnails. O script é na verdade uma função chamada createthumbnail(), que será chamada no meio do script que faz o upload. O código é o seguinte e logo depois, os comentários:

<?php

/*-----------------------------------------+
| by Luís Fred: fred.alphax@gmail.com
+------------------------------------------*/


function createthumbnail($filetype, $origfile, $thumbfile, $new_w, $new_h) {

global $settings;

if ($filetype == 1) { $origimage = imagecreatefromgif($origfile); }
elseif ($filetype == 2) { $origimage = imagecreatefromjpeg($origfile); }
elseif ($filetype == 3) { $origimage = imagecreatefrompng($origfile); }

$old_x = imagesx($origimage);
$old_y = imagesy($origimage);

if ($old_x > $new_w || $old_y > $new_h) {
if ($old_x < $old_y) {
$thumb_w = round(($old_x * $new_h) / $old_y);
$thumb_h = $new_h;
} elseif ($old_x > $old_y) {
$thumb_w = $new_w;
$thumb_h = round(($old_y * $new_w) / $old_x);
} else {
$thumb_w = $new_w;
$thumb_h = $new_h;
}
} else {
$thumb_w = $old_x;
$thumb_h = $old_y;
}

if ($settings['thumb_compression'] == "gd1") {
$thumbimage = imagecreate($thumb_w,$thumb_h);
$result = imagecopyresized($thumbimage, $origimage, 0, 0, 0, 0, $thumb_w, $thumb_h, $old_x, $old_y);
} else {
$thumbimage = imagecreatetruecolor($thumb_w,$thumb_h);
$result = imagecopyresampled($thumbimage, $origimage, 0, 0, 0, 0, $thumb_w, $thumb_h, $old_x, $old_y);
}

touch($thumbfile);

if ($filetype == 1) { imagegif($thumbimage, $thumbfile); }
elseif ($filetype == 2) { imagejpeg($thumbimage, $thumbfile); }
elseif ($filetype == 3) { imagepng($thumbimage, $thumbfile); }
}

function image_exists($dir, $image) {
$i = 1;
$image_name = substr($image, 0, strrpos($image, "."));
$image_ext = strrchr($image,".");
while (file_exists($dir.$image)) {
$image = $image_name."_".$i.$image_ext;
$i++;
}
return $image;
}
?>

Este é o código comentado:

<?php

/**
* @author Luís Fred
* @mail fred.alphax@gmail.com
*/


/*Esta é a função que se encarregará de criar as imagens menores, ela contem
*5 variáveis como parâmetros, que são:
* $filetype: o tipo de arquivo envolvido, se gif, jpeg ou png;
* $origfile: E o arquivo de imagem original, que você indicou para upload e que dará
* origem à uma imagem menor(thumb);
* $thumbfile: Este parâmetro conterá o caminho/nome da imagem que será a nossa imagem
* de tamanho reduzido(thumb);
* $new_w: Esta variável conterá o valor de configuração para a largura da imagem menor;
* $new_h: Está variável conterá o valor de configuração para a altura da imagem menor;
*/



function createthumbnail($filetype, $origfile, $thumbfile, $new_w, $new_h, $compress) {

/*Nas três linhas que seguem, são feitas algumas verificações acerca do tipo de arquivo de imagem.
*Para cada verificação bem sucedida, é criado um novo arquivo de imagem a partir da imagem original.
*a função imagecreatefrom*() retorna um identificador de imagem representando a imagem obtida através do nome de *arquivo dado.
**/


if ($filetype == 1) { $origimage = imagecreatefromgif($origfile); }
elseif ($filetype == 2) { $origimage = imagecreatefromjpeg($origfile); }
elseif ($filetype == 3) { $origimage = imagecreatefrompng($origfile); }


/*Nestas duas linhas que seguem, note que são obtidas largura e altura da imagem com as funções
*imagesx() e imagesy() respectivamente. para mais informações sobre as funções utilizadas neste
*script, acesse www.php.net
*/

$old_x = imagesx($origimage);
$old_y = imagesy($origimage);

/*verifica se a largura e altura obtidas anteriormente são maiores
*que a largura e a altura estabelecidas estabelecidas para as imagens menores
*que serão criadas.
*Em seguida, estabelece as novas dimensões para a imagem original. veja o uso
*da função round() na terceira linha do laço if():
*$thumb_w = round(($old_x * $new_h) / $old_y).
*multiplica-se o valor da largura que foi obtida da imagem, usando imagesx() pelo
*valor da altura estabelecido para a imagem menor. em seguida divide-se o valor obtido
*pela altura da imagem original, a função round() arredonda o valor do resultado nesta
*operação. Este resultado é então armazenado na variável $thumb_w, que será a largura
*da imagem pequena.
*a operação $thumb_h = round(($old_y * $new_w) / $old_x); segue o mesmo raciocínio.
*/

if ($old_x > $new_w || $old_y > $new_h) {
if ($old_x < $old_y) {
$thumb_w = round(($old_x * $new_h) / $old_y);
$thumb_h = $new_h;
} elseif ($old_x > $old_y) {
$thumb_w = $new_w;
$thumb_h = round(($old_y * $new_w) / $old_x);
} else {
$thumb_w = $new_w;
$thumb_h = $new_h;
}
} else {
$thumb_w = $old_x;
$thumb_h = $old_y;
}

/*a partir daqui, temos a criação propriamente dita, das imagens pequenas.
*Repare nas funções imagecreate() e imagecreatetruecolor(). Esta ultima requer
*versão GD 2.0.1 ou maiores. se não for possível usar gd1, então será usada gd2 para
*diminuir a imagem original.
*a função imagecopyresized() redimensiona e copia a imagem.
*imagecreatetruecolor() tem um efeito similar a imagecreate().
*Para mais informações a respeito de imagecreatetruecolor(), imagecreate() e imagecopyresampled(),
*acesse www.php.net.
*/

if ($compress == "gd1") {
$thumbimage = imagecreate($thumb_w,$thumb_h);
$result = imagecopyresized($thumbimage, $origimage, 0, 0, 0, 0, $thumb_w, $thumb_h, $old_x, $old_y);
} else {
$thumbimage = imagecreatetruecolor($thumb_w,$thumb_h);
$result = imagecopyresampled($thumbimage, $origimage, 0, 0, 0, 0, $thumb_w, $thumb_h, $old_x, $old_y);
}

/*Muda o tempo de acesso e modificação do arquivo de imagem fornecido como terceiro parâmetro da função *createthumbnail() para o tempo atual.
*/

touch($thumbfile);
/*a função imagegif() cria uma imagem gif em $thumbfile a partir de $thumbimage
*que guarda a imagem que foi criada com novas dimensões.
*imagejpeg() e imagepng() tem efeitos similares a função imagegif().
*/

if ($filetype == 1) { imagegif($thumbimage, $thumbfile); }
elseif ($filetype == 2) { imagejpeg($thumbimage, $thumbfile); }
elseif ($filetype == 3) { imagepng($thumbimage, $thumbfile); }
}

/*Esta função checa se uma imagem existe em um determinado diretório.
*se a imagem procurada existir, então será criado um nome diferente para ela
*/

function image_exists($dir, $image) {
$i = 1;
$image_name = substr($image, 0, strrpos($image, "."));
$image_ext = strrchr($image,".");
while (file_exists($dir.$image)) {
$image = $image_name."_".$i.$image_ext;
$i++;
}
return $image;
}

?>

Faça o download do código acima aqui.

Página anterior     Próxima página

Páginas do artigo
   1. Introdução
   2. Upload (criando o formulário)
   3. Upload (estabelecendo configurações)
   4. Upload (função para redimensionar as imagens)
   5. Upload (copiando as imagens para seus diretórios)
   6. Conclusão e referências
Outros artigos deste autor

Criando uma agenda eletrônica com PHP/MySQL

Como criar um sistema de autenticação de usuários usando PHP/MySQL

Leitura recomendada

PEAGLE: Serviço Web de busca indexada em seu servidor local

O perigo no gerenciador de uploads do PHP

Manipulação de arquivos com PHP

Gerando documentos PDF com a classe FPDF no PHP

Organizando fotos de camêra digital

  
Comentários
[1] Comentário enviado por jolupi em 07/11/2008 - 15:09h

Excelente conjunto de artigos. Copiei para estudar e não funcionou. Ele não encontra insert_image.php que é a action do index.php. Vc já reparou ou eu estou dando mole ?

[2] Comentário enviado por fredwind em 07/11/2008 - 20:59h

é verdade jolupi, o formulario não consegue encontrar insert_image.php porque na verdade ele não existe, foi um vacilo meu. Na verdade o script que o formulario deveria procurar é upload.php, pouco antes de enviar o artigo pro site eu mudei o nome do script insert_image.php para upload.php porque achei mais conveniente e esqueci de fazer a modificação no formulario, desculpe. Qualquer duvida pode me mandar um email, é sempre um prazer ajudar!!!

[3] Comentário enviado por doc.ric em 22/01/2009 - 01:05h

Oi,

Gostei muito da tua solução, e pretendo utilizá-la em um projeto q estou desenvolvendo.
Tentei fazer funcionar o upload, mas não consigo criar as fotos jpg nas pastas "large" e "thumbnail" ... Estou usando o WampServer, com PHP 5.2.6.
Podes me mandar teu email de contato para q possa te remeter a instalação ?
Um abraço,
Ric
doc.ric@bol.com.br

[4] Comentário enviado por driseven em 05/02/2009 - 10:21h

amigos,


qdo tente anexar uma imagem, ocorreu o seguinte erro:

Warning: main(./fun_upload.php) [function.main]: failed to open stream: No such file or directory in /home/quintalf/public_html/teste/upload.php on line 6

Warning: main(./fun_upload.php) [function.main]: failed to open stream: No such file or directory in /home/quintalf/public_html/teste/upload.php on line 6

Warning: main(./fun_upload.php) [function.main]: failed to open stream: No such file or directory in /home/quintalf/public_html/teste/upload.php on line 6

Warning: main() [function.include]: Failed opening './fun_upload.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/quintalf/public_html/teste/upload.php on line 6
A imagem deve ter um nome legivel


alguém poderia me dizer o pq?

[5] Comentário enviado por scavenger em 09/03/2009 - 09:22h

Driseven,

Altere a linha:

include ($path . "fun_upload." . $phpExt);

para:

include ($path . "func_upload." . $phpExt);

do arquivo upload.php

Até mais,

Rodrigo Spillere

[6] Comentário enviado por amj233 em 06/04/2009 - 17:02h

Muito bom!!!

Se houver duas imagens com nomes iguais o sistema substitui a anterior pela nova, não é?.
Me corrijam se estiver errado!!!

[7] Comentário enviado por henbran em 18/02/2010 - 10:42h

BOM DIA.
PORVENTURA HÁ COMO CARREGAR OS BIT's DA IMAGEM, UTILIZANDO RECURSOS HTML/JAVASCRIPT, AO INVÉS DO ARQUIVO EM SI?
MEU PROVEDOR (localweb) TEM RESTRIÇÕES DE USUÁRIO, SERIA MAIS TRABALHOSO CONCEDER DIREITOS A UM DETERMINADO USUÁRIO EM CARREGAR IMAGENS.
O QUE PRECISO NA VERDADE É INSERIR A IMAGEM NO BANCO DE DADOS E NÃO GUARDÁ-LA NO SERVIDOR EM FORMA DE ARQUIVO.
OBRIGADO.

[8] Comentário enviado por fredwind em 19/02/2010 - 09:02h

Caro herban, eu creio que esta solução não seja possivel ou pelo menos ainda nao tenho visto algo assim em trabalhos com MySQL, é preciso que as imagens fiquem em diretorios especificos e seus nomes e/ou paths no banco de dados. Obrigado pelo comentário. Qualquer coisa é so da o toque!!

[9] Comentário enviado por Luiz Araujo em 23/02/2010 - 17:41h

Windboy,

Obrigado pelo código.


No formulário do arquivo principal, que deve se chamar index.html (location chamado pelo upload.php) o action ainda está apontando para "./insert_image.php" ao invés de "upload.php".

No link para o código fonte do upload.php:
(http://www.vivaolinux.com.br/imagens/artigos/comunidade/upload.php.txt_
Na linha 10, houve um erro de digitação. O código correto é:
include ($path . "func_upload." . $phpExt);

[]s,


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts