Olá a todos.
Posto aqui um trecho de código que usei em um form com 2 campos tipo “imagem (nome de arquivo)”. Em experiências anteriores, com meus sistemas “for windows”, tive alguns problemas, porque os usuários mandavam sempre imagens gigantes, extraídas diretamente de câmeras digitais. Como eram sistemas tipo desktop, não havia delay de upload. No ambiente web isso tem um custo de tempo e banda e já percebi que o usuário pensa 2 vezes antes de enviar uma imagem com 4MB por exemplo. Mesmo assim, torna-se inviável desperdiçar espaço em disco no servidor, pois nem o monitor nem as impressoras comuns que encontramos no mercado tem capacidade para exibir toda a qualidade destas imagens. Decidi então reduzí-las forçadamente através do código abaixo, que faz o seguinte:
- Filtra o tipo de imagem (ainda pela extensão, não pelo mime-type) no onValidate;
- Redimensiona as imagens gravadas para uma largura configurável e altura proporcional, para não haver distorção;
- Renomeia as imagens inseridas, aplicando uma padronização;
- Atualiza a tabela com os novos nomes de arquivo padronizados.
Não tenho experiência quase nenhuma com php, então se alguém mais experiente quiser melhorar o código fique a vontade, desde que poste também o resultado para todos.
No meu sistema, tenho uma tabela com 2 campos “imagem (nome de arquivo)”. Usei os eventos onValidate, onAfterUpdate e onAfterInsert. As imagens são filtradas pela extensão, ainda não estou usando o mime-type, que seria o mais correto.
As rotinas estão usando meus nomes de campo (imagem1 e imagem2).
Código no onValidate do form:
[size=8pt]$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
");
sc_error_exit();
}[/size]
Código no onAfterUpdate e onAfterInsert do form:
[size=8pt]#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}’”);
}[/size]
Falta ainda verificar se as imagens não tem o mesmo nome, se alguém quiser tratar…
Espero ter contribuído, um abraço a todos.
Rodrigo Araújo