← Tutoriais

[PHP] Dimensões e qualidade de imagem (JPEG)

Lida 7055 vezes

Offline

SSPT 
Membro
Mensagens 408 Gostos 0
Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

Um dos grandes inimigos dos webmasters é o limite de trafego, por vezes pequeno.

À uns meses atras deparei-me com o seguinte problema:
» Camara com 7.1 Megapixels
» Imagens com mais de 5MBs

Como não tinha problemas de espaço no servidor enviei 10 fotos (50MBs)

Apos 100 visitas tinham desaparecido os 5GB de trafego mensal.

Para evitar este tipo de problemas criei um codigo muito simples que:
» Diminui o tamanho das imagens
» Diminui a qualidade (opcional)

index.php
Código: [Seleccione]

<?

$directory  = opendir("images/");
while (false !== ($filename = readdir($directory))) {
   $files[] = $filename;
}

sort($files);

$i=0;
while($files[$i] <> '')
{
   if($files[$i] <> '..' && $files[$i] <> '.')
   {
      echo "<a href=\"show_image.php?size=big&img=" . $files[$i]  . "\" <img src=\"show_image.php?size=thumb&img=" . $files[$i]  . "\"></a><br>";
   }
   $i++;
}


?>


show_image.php
Código: [Seleccione]

<?
if($size == "big")
{
   $max_width = 750;

}
else
{
   $max_width = 50;

}

$image = "images/$img";
$size = GetImageSize($image);
$im=@imagecreatefromjpeg($image);

if ($size[0] > $max_width)
{
   $multiplier = $size[0] / $max_width;
   $width = $size[0] / $multiplier;
   $height = $size[1] / $multiplier;
   $thumb = imagecreatetruecolor($width, $height);
   ImageCopyResampled($thumb, $im, 0, 0, 0, 0, $width, $height, $size[0], $size[1]);
   header("Content-type: image/jpeg");
   imagejpeg($thumb,'',90);

}
else
{
   header("Content-type: image/jpeg");
   imagejpeg($im,'',90);

}

ImageDestroy($im);
?>


Agora cada imagem ocupa cerca de 100kbs e a 'diminuição' feita pela GD Lib tem uma qualidade superior à que é feita automaticamente pelos browsers :)

PS: Com este codigo basta colocarem as imagens no directorio 'images' que elas aparecem automaticamente (obvio)
Offline

kingless 
Membro
Mensagens 857 Gostos 0
Troféus totais: 27
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

O codigo é interessante... eu trabalho pouco com funções de imagens mas acho que vou começar em breve.
Offline

raugusto 
Elite
Mensagens 3145 Gostos 33
Feedback +13

Troféus totais: 31
Trófeus: (Ver todos)
Level 6 Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2

sim, mas acopa processador...

porque não fazer um save for the web em jpg qualidade 60% com essas dimensoes e fazer o upload directo das imagens?

é que a banda tb a gastas a fazer o FTP!!!!!!
Offline

tbk22 
Membro
Mensagens 1268 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Muito fixe!

Dá para diminuir imagens bem grandes!!
Offline

OFFICER 
Membro
Mensagens 2076 Gostos 0
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Citação de: "raugusto"
sim, mas acopa processador...

porque não fazer um save for the web em jpg qualidade 60% com essas dimensoes e fazer o upload directo das imagens?

é que a banda tb a gastas a fazer o FTP!!!!!!


JPG com 60% de qualidade?Isso não fica nada de jeito..acho que prefiro gif's a jpg's de 60% de qualidade..lol

Se colocar alguma imagem em jpg coloco-a a 100%, caso queira que o site fique com espaço reduzido.
Offline

raugusto 
Elite
Mensagens 3145 Gostos 33
Feedback +13

Troféus totais: 31
Trófeus: (Ver todos)
Level 6 Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4 Level 3 Level 2

Citar
Isso não fica nada de jeito..acho que


preferes uma foto em gif do que jpg? depende do objectivo...se forem elementos graficos é uma coisa...fotografias é outra...e os 60% foram mandados para o ar...pode escolher a opção que quizer...
Offline

helt 
Membro
Mensagens 111 Gostos 0
Troféus totais: 25
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 100 Posts

Acho q se fizeste isso também devias ter feito um sistema de cache pá... olha o processamento que isso exige do servidor... cada vez q alguém acede à página o script cria e destrói a imagem criada a seguir... n faz sentido... ou crias o tal sistema de cache ou então destróis a imagem de origem em vez da imagem gerada.
Offline

SSPT 
Membro
Mensagens 408 Gostos 0
Troféus totais: 26
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2 Level 1

Este script demonstra a capacidade de processamento da GD lib, sendo essa a única intenção :)
Offline

helt 
Membro
Mensagens 111 Gostos 0
Troféus totais: 25
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 100 Posts

Pois, então coloca uma nota para o efeito, é que este script como está agora num site que gere tráfego acima da média, possívelmente ia resultar num crash do servidor.
Offline

morpheus 
Membro
Mensagens 1199 Gostos 0
Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 1000 Posts

Citação de: "raugusto"
porque não fazer um save for the web em jpg qualidade 60% com essas dimensoes e fazer o upload directo das imagens?


e prontos... parece que adivinhaste um script que fiz hoje! para quem quiser:

Código: [Seleccione]

$now="O_CAMPO_FILE_DO_FORMULARIO";
$filename = "O_NOME_QUE_QUISEREM.jpg";
$quality="A_QUALIDADE_DO_JPG";
$uploadedfile = $_FILES[$now]['tmp_name'];
$src = imagecreatefromjpeg($uploadedfile);
list($width,$height)=getimagesize($uploadedfile);
# A largura do ficheiro. a altura é calculada percentualmente.
$newwidth=240;
$newheight=($height/$width)*$newwidth;
$tmp=imagecreatetruecolor($newwidth,$newheight);
imagecopyresampled($tmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height);
imagejpeg($tmp,$filename,$quality);
imagedestroy($src);
imagedestroy($tmp);


bom proveito! ;)