De TeHospedia
<?php
/***
script que gera efetua download de imagens e gera miniaturas
Se miniatura nao existir, gera a miniatura
Apos ou se a miniatura ja existir, redireciona o usuario para a imagem em cache
autor: Roberto Berto darkelder@php.net
licença: GPL v2
Caracteristicas:
- gera miniaturas JPG ja do width e height desejado
- usa cache: o algoritmo de redimensionamento - que e' pesado - e' utilizado
apenas uma vez para cada imagem, sendo o resultado salvo em uma pasta
Exemplo:
- sua imagem em tamanho grande esta em http://www.seusite.com.br/fotos/foto_joao.jpg
o tamanho da mesma e' 640x480 pixels
- voce utiliza o seguinte codigo hoje:
<img src="/fotos/foto_joao.jpg" width="80" height="60" >
- agora utilize apenas da seguinte forma:
<img src="/miniatura.php?foto=/fotos/foto_joao.jpg&width=80" width="80" height="60" >
onde:
foto= url da foto
width= tamanho em pixels da largura a ser gerada
height= tamanho em pixels da altura a ser gerada
Configuracao:
1) altere a constante de PASTA e URL da PASTA abaixo para a pasta onde as miniaturas serao salvas
2) voce deve criar a pasta da constante pelo seu FTP sem nenhum arquivo dentro
3) pergunte ao seu provedor se a pasta tem permissao para gravar arquivos, dependendo da configuracao
do provedor e' necessario adicionar essa permissao na pasta. Geralmente isso pode ser feito por voce
mesmo no gerenciador de arquivos do seu painel de controle ou pelo seu programa de FTP com o chmod 0777
Na TeHospedo (http://tehospedo.com.br/), que e' o provedor onde trabalho, esse procedimento nao e' necessario nem no Windows
nem no Linux
**/
// essa variavel e' o seu dominio
define("URL_SITE", 'http://seusite.com.br'); # ----> nao ponha / no final
/******* configuracao para linux **********/
// em linux na TeHospedo apenas altere meuUserdeFTP:
define("PASTA_CACHE", '/home/meuuserdeFTP/public_html/miniaturas/');
/******* configuracao para windows ********/
// em windows na TeHospedo descomente a linha abaixo e mude apenas o meuDominio.com.br:
// mesmo em windows, nao use \ para separar diretorios, use / que e' mais facil
// se descomentar a linha abaixo comente o define anterior
//
// define("PASTA_CACHE", 'd:/domains/meuDominio.com.br/wwwroot/miniaturas/');
/******* configuracao tanto para windows quanto para linux ******/
// a URL abaixo deve corresponder ao endereco web da PASTA_CACHE
define('URL_CACHE', 'http://seusite.com.br/miniaturas'); # ---> nao ponha / no final
// se for uma grande quantidade de arquivos, e' interessante deixar true
// assim, ira separar as miniaturas em subpastas
define('USAR_MULTI_DIRETORIOS', true);
////////////////////// NAO EDITE ABAIXO /////////////////////////
////////////////////// NAO EDITE ABAIXO /////////////////////////
////////////////////// NAO EDITE ABAIXO /////////////////////////
////////////////////// NAO EDITE ABAIXO /////////////////////////
////////////////////// NAO EDITE ABAIXO /////////////////////////
/******** tratamento de variaveis *********/
$url = URL_SITE . '/' . $_REQUEST['foto'];
$width = (int)$_REQUEST['width'];
$width = 143;
// nome dos arquivos que sera usado dentro da pasta de cache
$arquivo = sprintf("%s-%d.jpg",
md5($url),
$width
);
if (USAR_MULTI_DIRETORIOS == true) {
// nome do arquivo com multiplos diretorios
$arquivo_full = sprintf("%s/%s/%s",
substr($arquivo, 0, 2),
substr($arquivo, 2, 2),
$arquivo
);
} else {
// nome do arquivo sem multiplos diretorios
$arquivo_full = $arquivo;
}
// path e url do arquivo completa
$arquivo_path = sprintf("%s/%s", PASTA_CACHE, $arquivo_full);
$arquivo_path = str_replace("//", "/", $arquivo_path); // substitui // por /
$arquivo_url = sprintf("%s/%s", URL_CACHE, $arquivo_full);
$arquivo_path_tmp = $arquivo_path . '.tmp';
/*
printf("full: %s\n", $arquivo_full);
printf("path: %s\n", $arquivo_path);
printf("url: %s\n", $arquivo_url);
*/
if (file_exists($arquivo_path)) { // arquivo existe, vamos apenas redirecionar para ele
header(sprintf("Location: %s", $arquivo_url));
exit;
}
// miniatura nao existe, vamos gerar!
// gerar subdiretorio se for usado este metodo
if (USAR_MULTI_DIRETORIOS == true) {
$dir_level_1 = sprintf("%s/%s",
PASTA_CACHE,
substr($arquivo, 0, 2)
);
$dir_level_2 = sprintf("%s/%s/%s",
PASTA_CACHE,
substr($arquivo, 0, 2),
substr($arquivo, 2, 2)
);
// subdiretorio nao existe, cria
if (!file_exists($dir_level_1)) {
mkdir($dir_level_1);
}
if (!file_exists($dir_level_2)) {
mkdir($dir_level_2);
}
}
// efetuar download da miniatura num arquivo tmp
$fp = fopen($arquivo_path_tmp, 'w');
// abre o arquivo
$dados = file_get_contents($url);
if ($dados === false) {
die("nao posso abrir o arquivo\n\n");
}
fwrite($fp, $dados);
// gerar o thumb
$i = new imagethumbnail();
$i->open($arquivo_path_tmp); // coloque aqui o nome do arquivo original
$i->setX($width);
$i->imagejpeg($arquivo_path, 70);
unlink($arquivo_path_tmp);
if (file_exists($arquivo_path)) { // arquivo existe, vamos apenas redirecionar para ele
header(sprintf("Location: %s", $arquivo_url));
exit;
}
die("Algum erro ocorreu");
class imagethumbnail {
var $filename;
var $x;
var $y;
var $image;
var $thumbnail;
function open($filename) {
$this->filename = $filename;
$imageinfo = array();
$imageinfo = getimagesize($this->filename,$imageinfo);
$this->old_x = $imageinfo[0];
$this->old_y = $imageinfo[1];
switch ($imageinfo[2]) {
case "1": $this->image = imagecreatefromgif($this->filename); break;
case "2": $this->image = imagecreatefromjpeg($this->filename); break;
case "3": $this->image = imagecreatefrompng($this->filename); break;
}
}
function setX($x="") {
if (isset($x)) { $this->x = $x; }
return $this->x;
}
function setY($y="") {
if (isset($y)) { $this->y = $y; }
return $this->y;
}
function generate() {
if ($this->x > 0 and $this->y > 0) {
$new_x = $this->x;
$new_y = $this->y;
} elseif ($this->x > 0 and $this->x != "") {
$new_x = $this->x;
$new_y = ($this->x/$this->old_x)*$this->old_y;
} else {
$new_x = ($this->y/$this->old_y)*$this->old_x;
$new_y = $this->y;
}
$this->thumbnail = imagecreatetruecolor($new_x,$new_y);
$white = imagecolorallocate($this->thumbnail,255,255,255);
imagefill($this->thumbnail,0,0,$white);
imagecopyresampled ( $this->thumbnail, $this->image, 0, 0, 0, 0, $new_x, $new_y, $this->old_x, $this->old_y);
}
function imagejpeg($filename="",$quality=100) {
if (!isset($this->thumbnail)) { $this->generate(); }
imagejpeg($this->thumbnail,$filename,$quality);
}
}
?>