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: 73.016 ]

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

Enviar mensagem ao usuário trabalhando com as opções do php.ini

Manipulação de arquivos com PHP

Trabalhando com arquivos em PHP

Organizando fotos de camêra digital

Gerando documentos PDF com a classe FPDF no PHP

  
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