Sunteți pe pagina 1din 2

Ol a todos.

Posto aqui um trecho de cdigo que usei em um form com 2 campos tipo "imagem
(nome de arquivo)". Em experincias anteriores, com meus sistemas "for windows", tive
alguns problemas, porque os usurios mandavam sempre imagens gigantes, extradas
diretamente de cmeras digitais. Como eram sistemas tipo desktop, no havia delay de
upload. No ambiente web isso tem um custo de tempo e banda e j percebi que o
usurio pensa 2 vezes antes de enviar uma imagem com 4MB por exemplo. Mesmo
assim, torna-se invivel desperdiar espao 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 ento reduz-las foradamente atravs do
cdigo abaixo, que faz o seguinte:
1) Filtra o tipo de imagem (ainda pela extenso, no pelo mime-type) no onValidate;
2) Redimensiona as imagens gravadas para uma largura configurvel e altura
proporcional, para no haver distoro;
3) Renomeia as imagens inseridas, aplicando uma padronizao;
4) Atualiza a tabela com os novos nomes de arquivo padronizados.
No tenho experincia quase nenhuma com php, ento se algum mais experiente
quiser melhorar o cdigo fique a vontade, desde que poste tambm 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 so filtradas pela
extenso, ainda no estou usando o mime-type, que seria o mais correto.
As rotinas esto usando meus nomes de campo (imagem1 e imagem2).
Cdigo 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 so permitidas <br />");
sc_error_exit();
}

Cdigo no onAfterUpdate e onAfterInsert do form:


#O campo "subdiretrio" na definio dos campos no SC, esto com o seguinte contedo: "/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}'");
}

Falta ainda verificar se as imagens no tem o mesmo nome, se algum quiser tratar...
Espero ter contribudo, um abrao a todos.
Rodrigo Arajo

S-ar putea să vă placă și