| < ?php
|
| /**
|
| * Dosya = thumb.php
|
| * Yazan = Tuncay KINALI (a.k.a. Sniper)
|
| * Görevi = Parametre olarak verilen resmi istenilen boyutlarda küçültme, büyütme ve
|
| * orantılı olarak resmin içinden bir bölümü gösterme. Oluşturulan son resim
|
| * dosyasını yeniden isimlendirerek kaydetme. Sonraki çağırılışında bu isimde
|
| * dosya bulunduğu takdirde direkt olarak o dosyayı gösterme.
|
| * Parametreler = "p": Üzerinde oynanacak resmin yolu
|
| * "w": Resmin maximum genişliği (opsiyonel)
|
| * "h": Resmin maximum yüksekliği (opsiyonel)
|
| * Tarih = 11.08.2007
|
| * Son Güncelleme = 27.08.2009 - 21:11
|
| */
|
|
|
| // Gösterilecek resmin yolu.
|
| $p = $_GET['p'];
|
|
|
| // Resmin istenilen genişliği.
|
| // Olası kötü amaçlı kullanımlara karşı maximum genişliği 1024px olarak ayarlıyoruz.
|
| $w = intval($_GET['w']) > 1024 ? 1024 : intval($_GET['w']);
|
|
|
| // Resmin istenilen yüksekliği
|
| // Olası kötü amaçlı kullanımlara karşı maximum yüksekliği 768px olarak ayarlıyoruz
|
| $h = intval($_GET['h']) > 768 ? 768 : intval($_GET['h']);
|
|
|
| // Belirtilen resim dosya sisteminde varsa...
|
| if(file_exists($p)) {
|
| // Dosya adını ve uzantısını ayrı ayrı al.
|
| $dosyaAdi = substr($p, 0, strrpos($p, '.'));
|
| $uzanti = substr($p, strrpos($p, '.'));
|
|
|
| // Thumbnail dosya adını öğren
|
| /**
|
| * Thumbnail dosya adı, scriptin sonraki çalışmasında kontrol edeceği
|
| * içinde istenilen genişliğin ve yüksekliğin belirtildiği isimdir.
|
| * Örneğin thumb.php?p=resim.jpg&w=100&h=75 şeklinde çalıştırılan script
|
| * için thumbnail dosya adı "resim_100_75.jpg" olarak belirlenecektir.
|
| */
|
| $thumbFileName = $dosyaAdi;
|
| $thumbFileName .= $w>0 ? '_w'.$w : '';
|
| $thumbFileName .= $h>0 ? '_h'.$h : '';
|
| $thumbFileName .= $uzanti;
|
|
|
| // İstenilen ölçülerde thumbnail daha önce talep edilmiş ve dosya sistemine kaydedilmişse...
|
| if(file_exists($thumbFileName)) { // ... thumbnail dosyasına yönlen ve çalışmayı durdur.
|
| header("Location: {$thumbFileName}");
|
| exit;
|
| } else { // ... ilk defa talep edilen thumbnail dosyası için çalışmaya başla
|
|
|
| // Resmin bilgilerini al
|
| $resim = getimagesize($p);
|
|
|
| if($w && !$h) { // Max. Genişlik manuel olarak belirtilmiş ve yükseklik belirtilmemişse...
|
| // ... genişliği istenilen ölçüye getir ...
|
| $genislik = $w;
|
| // ... yüksekliği genişliğe orantılı bir şekilde hesapla.
|
| $yukseklik = round(($genislik*$resim[1])/$resim[0]);
|
| } elseif(!$w && $h) { // Max. Yükseklik manuel olarak belirtilmişse ve genişlik belirtilmemişse
|
| // ... yüksekliği istenilen ölçüye getir ...
|
| $yukseklik = $h;
|
| // ... genişliği yüksekliğe orantılı bir şekilde hesapla.
|
| $genislik = round(($yukseklik*$resim[0])/$resim[1]);
|
| } elseif($w && $h) { // Her iki özellikte manuel olarak belirtilmişse ...
|
| // ... özellikleri istenilen ölçüye getir.
|
| $yukseklik = $h;
|
| $genislik = $w;
|
| } else { // Her iki ölçü de girilmemişse ana resme git ve çalışmayı durdur.
|
| header('Location: '. $p);
|
| exit;
|
| }
|
|
|
| // Resmin türüne göre ana resmi belleğe kopyala
|
| switch($resim[2]) {
|
| case 1: // GIF
|
| $kopya_resim = imagecreatefromgif($p);
|
| $resim_mime_type = 'image/gif';
|
| break;
|
| case 2: // JPG
|
| $kopya_resim = imagecreatefromjpeg($p);
|
| $resim_mime_type = 'image/jpeg';
|
| break;
|
| case 3: // PNG
|
| $kopya_resim = imagecreatefrompng($p);
|
| $resim_mime_type = 'image/png';
|
| break;
|
| }
|
|
|
| // Belirlenen ölçülerde boş bir resim oluştur
|
| $thumb = imagecreatetruecolor($genislik, $yukseklik);
|
| // Belleğe kopyalanan ana resmi istenilen ölçülere göre küçülterek oluşturulan resmi
|
| // az önce oluşturduğumuz boş resmin içine yazdır.
|
| imagecopyresampled($thumb, $kopya_resim, 0, 0, 0, 0, $genislik, $yukseklik, $resim[0], $resim[1]);
|
|
|
| if($h) {
|
| /**
|
| * Eğer maximum yükseklik değeri manuel olarak girilmişse ve bu değer
|
| * scriptin oluşturduğu değerden farklıysa scriptin otomatik değeri yoksayılıp
|
| * elle girilen değer dikkate alınarak thumbnail yeniden boyutlandırılır
|
| */
|
|
|
| if($yukseklik>$h) $yukseklik = $h;
|
|
|
| $thumb2 = imagecreatetruecolor($genislik, $yukseklik);
|
|
|
| imagecopy($thumb2, $thumb, 0, 0, 0, (($h-$yukseklik)/2), $genislik, $yukseklik);
|
| $sonuc = $thumb2;
|
| } else {
|
| $sonuc = $thumb;
|
| }
|
|
|
| /** İstenilen boyuttaki thumbnail artık hazır
|
| * Resmin türüne göre oluşturulan thumbnaili dosya sistemine yazdırmayı deneyeceğiz.
|
| * Resmin bulunduğu klasörün yazma izinleri verilmişse thumbnail dosyası yukarıda
|
| * ayarlanan isimle klasöre kaydedilir ve script kaydedilen bu dosyaya yönlendikten sonra
|
| * çalışmayı durdurur. Yazma izinlerinde sorun varsa -ki bu scriptin esprisini yok eder-
|
| * oluşturulan thumbnail'i direkt olarak browser'a yollar ve her seferinde yukarıdaki işlemleri yapar
|
| */
|
|
|
| switch($resim[2]) {
|
| case 1: // GIF
|
| if(@imagegif($sonuc,$thumbFileName)) {
|
| header('Location: '.$thumbFileName);
|
| exit;
|
| } else {
|
| header("Content-Type: {$resim_mime_type}");
|
| imagegif($sonuc);
|
| }
|
| break;
|
| case 2: // JPG
|
| if(@imagejpeg($sonuc,$thumbFileName,80)) {
|
| header('Location: '.$thumbFileName);
|
| exit;
|
| } else {
|
| header("Content-Type: {$resim_mime_type}");
|
| imagejpeg($sonuc,NULL,80);
|
| }
|
| break;
|
| case 3: // PNG
|
| if(@imagepng($sonuc,$thumbFileName)) {
|
| header('Location: '.$thumbFileName);
|
| exit;
|
| } else {
|
| header("Content-Type: {$resim_mime_type}");
|
| imagepng($sonuc);
|
| }
|
| break;
|
| }
|
|
|
| // Tüm işlemler bittikten sonra bellek boşaltılıp bir nebze olsun sunucu rahatlatılır
|
| imagedestroy($sonuc);
|
| }
|
| }
|
| ?> |