Autor Tópico: Tratamento de Imagens jpeg  (Lida 4229 vezes)

waae

  • Avançado
  • ****
  • Mensagens: 292
    • Email
Tratamento de Imagens jpeg
« Online: Maio 17, 2010, 12:57:05 pm »
Esse código foi colocado no forúm pelo Rodrigo Araujo (rrma)
Ele serve para reduzir forçadamente as imagens que um usuário coloque via formulário para assim não haver desperdicio de espaço em disco no servidor e tempo de upload. Ele faz o seguinte:

1) Filtra o tipo de imagem (ainda pela extensão, não pelo mime-type) no onValidate;
2) Redimensiona as imagens gravadas para uma largura configurável e altura proporcional, para não haver distorção;
3) Renomeia as imagens inseridas, aplicando uma padronização;
4) Atualiza a tabela com os novos nomes de arquivo padronizados.

No sistema que ele usou, havia uma tabela com 2 campos "imagem (nome de arquivo)". Usou os eventos onValidate, onAfterUpdate e onAfterInsert.
As rotinas estão usando os nomes de campo imagem1 e imagem2.

Código no onValidate do form:
$foto1_nome = {imagem1};
$foto1_extensao = end(explode(".", $foto1_nome));
$foto2_nome = {imagem2};
$foto2_extensao = end(explode(".", $foto2_nome));

if ($foto1_extensao != "jpg" || $foto2_extensao != "jpg")
{
   sc_error_message("Apenas imagens JPG são permitidas <br />");
   sc_error_exit();
}

Código no onAfterUpdate e onAfterInsert do form:
#O campo "subdiretório" na definição dos campos no SC, estão com o seguinte conteúdo: "/fotos/{quadra}/{inscricao_cadastral}/"
#$pasta é o caminho absoluto das imagens
#maxdim é o valor da largura em px para o redimensionamento das imagens
$pasta = "/var/www/gcmweb/_lib/file/img/fotos/".{quadra}."/".{inscricao_cadastral}."/";
$maxdim=400;
if (strlen(trim({imagem1})) > 0)
{
   $foto1_nomeold = {imagem1};
   $foto1_extensao = end(explode(".", $foto1_nomeold));
   $foto1_nomenew = {inscricao_cadastral}."_foto1.".$foto1_extensao;
   $foto1_caminhocompleto_old = $pasta.$foto1_nomeold;
   $foto1_caminhocompleto_new = $pasta.$foto1_nomenew;
   list($larg_orig, $alt_orig) = @getimagesize($foto1_caminhocompleto_old);
   if ($larg_orig > $maxdim)
   {
      #Se a largura for maior que maxdim
      $razao_orig = $larg_orig/$alt_orig;
      $alt = $maxdim/$razao_orig; #Define a altura proporcional à largura
      $larg = $maxdim;
      $imagem_nova1 = imagecreatetruecolor($larg, $alt); #Cria o objeto imagem
      $imagem1 = @imagecreatefromjpeg($foto1_caminhocompleto_old); #Carrega o arquivo
      @imagecopyresampled($imagem_nova1, $imagem1, 0, 0, 0, 0, $larg, $alt, $larg_orig, $alt_orig); #Redimensiona
      @imagejpeg($imagem_nova1, $foto1_caminhocompleto_new); #Salva com novo nome
      unlink($foto1_caminhocompleto_old); #Apaga arquivo com nome antigo
   }
   else
   {
      #Se a imagem for menor ou igual a maxdim, apenas padronizo o nome
      rename($foto1_caminhocompleto_old, $foto1_caminhocompleto_new);
   }
   sc_exec_sql("UPDATE LOT1600 SET imagem1 = '" . $foto1_nomenew . "' WHERE inscricao_cadastral = '{inscricao_cadastral}'");
}
if (strlen(trim({imagem2})) > 0)
{
   $foto2_nomeold = {imagem2};
   $foto2_extensao = end(explode(".", $foto2_nomeold));
   $foto2_nomenew = {inscricao_cadastral}."_foto2.".$foto2_extensao;
   $foto2_caminhocompleto_old = $pasta.$foto2_nomeold;
   $foto2_caminhocompleto_new = $pasta.$foto2_nomenew;
   list($larg_orig, $alt_orig) = @getimagesize($foto2_caminhocompleto_old);
   if ($larg_orig > $maxdim)
   {
      $razao_orig = $larg_orig/$alt_orig;
      $alt = $maxdim/$razao_orig;
      $larg = $maxdim;
      $imagem_nova2 = imagecreatetruecolor($larg, $alt);
      $imagem2 = @imagecreatefromjpeg($foto2_caminhocompleto_old);
      @imagecopyresampled($imagem_nova2, $imagem2, 0, 0, 0, 0, $larg, $alt, $larg_orig, $alt_orig);
      @imagejpeg($imagem_nova2, $foto2_caminhocompleto_new);
      unlink($foto2_caminhocompleto_old);
   }
   else
   {
      rename($foto2_caminhocompleto_old, $foto2_caminhocompleto_new);
   }
   sc_exec_sql("UPDATE LOT1600 SET imagem2 = '" . $foto2_nomenew. "' WHERE inscricao_cadastral = '{inscricao_cadastral}'");
}

wetsite

  • Iniciante
  • **
  • Mensagens: 57
  • Aprender e aprimorar sempre...
    • Email
Re: Tratamento de Imagens jpeg
« Responder #1 Online: Agosto 18, 2010, 12:28:24 pm »
Prezado Waae,

Quero agradecer, isso é exatamente o que eu estava procurando, vou fazer os devidos testes e em caso de dúvidas, solicito sua ajuda.

Welington Santos
Welington Santos

Reação Web

  • Intermediário
  • ***
  • Mensagens: 164
Re:Tratamento de Imagens jpeg
« Responder #2 Online: Janeiro 16, 2012, 03:42:56 pm »
estou tendo a seguinte mensagem de erro com a extensão

Extensao: Ð<ÃVÚÍÀ,Ê!9̪aÃ÷00ê¸FTLSÔ-D0·XìQR1bÄ`ß]¡øk'ÔÉõÿ##ñ,YþßÀdZe;ŨLÿÙ

o meu campo é Imagem(Banco de dados)

existe um echo no OnValidate

Luiz Baião

  • Novato
  • *
  • Mensagens: 31
    • Email
Re:Tratamento de Imagens jpeg
« Responder #3 Online: Julho 22, 2014, 10:33:44 am »
Pessoal bom dia.

Estou utilizando a função rename como indicado no exemplo mas está aparecendo a mensagem:
O arquivo já está sendo usado por outro processo. (code: 32)

Não estou precisando fazer toda a verificação se o arquivo já existir pois estou usando outro mecanismo de controle renomeando o nome do arquivo a ser inserido no BD, mas ao renomear o arquivo físico a mensagem ocorre.

Creio que seja pois está tentando renomear, mas o arquivo ainda não teve o upload concluído.

Alguém tem alguma sugestão?