Bugüne kadar hazırladığım web siteleri çoğunlukla katalog tarzı ürün tanıtım siteleriydi. Bu sitelerde bir ürünün farklı ebatlarda resimlerini sitenin çeşitli yerlerinde kullanmam gerekiyordu. Zamanında buna çare olarak bir script hazırlamıştım. Script, kendisine parametre olarak gönderilen resmin istenilen boyutlarda bir küçüç kopyasını çalışma anında oluşturuyor ve tarayıcıya gönderiyordu. Böylelikle hem disk alanından kâr ediyor, hem de her boyut için manuel olarak tüm resimlerin thumbnailini oluşturma zahmetinden kurtuluyordum. Bu scripti, ASP yazdığım zamanlarda ASPJpeg bileşeni kullanarak geliştirmiştim. PHP’ye geçince aynı işi yapan PHP kodlarını da hazırladım ama bu kodlar ASP’deki kadar hızlı çalışmıyordu. Resimlerin görüntülenmesinde gözle görülür bir yavaşlama söz konusuydu ama gerek zamansızlık, gerekse PHP alanında tecrübesiz olmamdan dolayı bu konunun üstünde fazla durmamıştım. Son birkaç gündür bu scriptle ilgilenme fırsatım oldu ve nasıl daha az kaynak tüketerek scripti daha verimli hale getirebilirim diye düşündüm. Madem her resmin thumbnail’i oluşturulup tarayıcıya gönderiliyor, neden bunları bir dosyaya kaydetmeyeyim? Hem bir sonraki çağırılışlarında direkt oluşturduğum dosyayı çağırırım ve işlemciyi yormam, hem de her resmin istediğim ebatlardaki thumbnaillerini elimi sürmeden oluşturmuş olurum.Scriptin adı thumb.php, dışarıdan 3 parametre alıyor:

  • p: Üzerinde işlem yapılacak olan resmin dosya sistemi üzerindeki tam yolu. Scriptin esprisini kaybetmemesi açısından yeniden boyutlandırılacak resmin bulunduğu klasörün yazma izinleri ayarlanmış olmalıdır.
  • w: Resmin dönüştürüleceği maximum genişlik. (Kötü amaçlı kullanımlardan korunmak amacıyla 1024px ile sınırlandırılmıştır.)
  • h: Resmin dönüştürüleceği maximum yükseklik. (Kötü amaçlı kullanımlardan korunmak amacıyla 768px ile sınırlandırılmıştır.)

w ve h parametreleri opsiyonel olup istenirse her ikisinin de kullanılacağı gibi sadece biri de kullanılabilir. Hiçbirini kullanmamak resmi doğrudan çağırmakla eşdeğer olacağından bir anlam ifade etmez. Scriptin çalışma mantığı özetle şöyle:

  • Resmin genişlik ve yükseklik parametreleri alınır, yukarıda bahsedilen sınırlandırma uygulanır.
  • p parametresinde belirtilen resim dosyasının varlığı doğrulanır.
  • Resim için bir thumbnail dosya adı oluşturulur. Bu dosya adı; orjinal resmin adı[_w[genişlik değeri_hyükseklik değeri]].uzantı formatındadır. (Örneğin: “thumb.php?p=sniper.jpg&w=100&h=75” olarak çağırılan dosyanın thumbnail adı “sniper_w100_h75.jpg” olacaktır.)
  • Ortaya çıkan thumbnail dosya adı kullanılarak daha önce bu isimde bir dosya oluşturulmuşsa script o dosyaya yönlenir ve çalışmayı durdurur.
  • Resim dosyası belirtilen özelliklerle ilk defa çağırılıyorsa istenilen genişlik ve yükseklik değerleri işlenip orantılı bir şekilde küçük resim oluşturulur.
  • Resmin bulunduğu klasörün yazma izinleri ayarlanmışsa oluşturulan küçük resim klasöre kaydedilir, script kaydedilen dosyaya yönlendirilir ve çalışmayı durdurur.
  • Eğer klasörün yazma izni yoksa oluşturulan thumbnail direkt olarak tarayıcıya gönderilir ve dosyanın sonraki çağırılışlarında tüm bu işlemler tekrar eder.

Son olarak birkaç örnek kullanım ve bu kullanımlar sonucunda oluşacak dosya bilgilerini verdikten sonra kodları alabilirsiniz. Örnek kodlar 1280×960 px boyutlarında bir resim üzerinde çalıştırılmıştır.Dosya Adı: wall1_h200.jpgGenişlik: 267pxYükseklik: 200pxKodun çalışan halini görmek için tıklayınDosya Adı: wall1_w200.jpgGenişlik: 200pxYükseklik: 150pxKodun çalışan halini görmek için tıklayınDosya Adı: wall1_w200_h200.jpgGenişlik: 200pxYükseklik: 200pxKodun çalışan halini görmek için tıklayın
Ve kodun tamamı: thumb.php < ?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 kopyalaswitch($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: // GIFif(@imagegif($sonuc,$thumbFileName)) {header(‘Location: ‘.$thumbFileName);exit;} else {header(“Content-Type: {$resim_mime_type}”);imagegif($sonuc);}break;case 2: // JPGif(@imagejpeg($sonuc,$thumbFileName,80)) {header(‘Location: ‘.$thumbFileName);exit;} else {header(“Content-Type: {$resim_mime_type}”);imagejpeg($sonuc,NULL,80);}break;case 3: // PNGif(@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ırimagedestroy($sonuc);}}?> Not: Bu yazının bir kopyası da http://tuncay.kinali.net/php-ile-otomatik-thumbnail-olusturun.html adresinde yayınlanmaktadır.