resize.php
<?php
/**
 * 	Dosya			= thumb.php
 *	Yazan			= Tuncay KINALI (****.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)
 *					  "g": Bu değer 1 olarak tanımlandığı durumda, istenilen resim siyah-beyaz formatta gösterilir (opsiyonel)
 *	Tarih			= 11.08.2007
 * 	Son Güncelleme 	= 15.10.2010 - 10:43
 */
 
error_reporting(2);
 
// 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']);
 
// Resmi siyah/beyaz göstermek için bu parametrenin değeri 1 olmalı
$g = intval($_GET['g']);
 
// 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) && $g===0) { // ... 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);
		imagealphablending($thumb, false);
		imagesavealpha( $thumb, true );
 
		// 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($g===1) { // Resim siyah beyaz istenmişse çevirip gönder
					function_exists('imagefilter') ? imagefilter($sonuc, IMG_FILTER_GRAYSCALE) : grayScale($sonuc);
					header("Content-Type: {$resim_mime_type}");
					imagegif($sonuc);
				} else {
					if([MENTION=7435]image[/MENTION]gif($sonuc,$thumbFileName)) {
						header('Location: '.$thumbFileName);
						exit;
					} else {
						header("Content-Type: {$resim_mime_type}");
						imagegif($sonuc);
					}
				}
				break;
			case 2: // JPG
				if($g===1) { // Resim siyah beyaz istenmişse çevirip gönder
					function_exists('imagefilter') ? imagefilter($sonuc, IMG_FILTER_GRAYSCALE) : grayScale($sonuc);
					header("Content-Type: {$resim_mime_type}");
					imagejpeg($sonuc,NULL,80);
				} else {
					if([MENTION=7435]image[/MENTION]jpeg($sonuc,$thumbFileName,80)) {
						header('Location: '.$thumbFileName);
						exit;
					} else {
						header("Content-Type: {$resim_mime_type}");
						imagejpeg($sonuc,NULL,80);
					}
				}
				break;
			case 3: // PNG
				if($g===1) { // Resim siyah beyaz istenmişse çevirip gönder
					function_exists('imagefilter') ? imagefilter($sonuc, IMG_FILTER_GRAYSCALE) : grayScale($sonuc);
					header("Content-Type: {$resim_mime_type}");
					imagepng($sonuc);
				} else {
					if([MENTION=7435]image[/MENTION]png($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);
	}
}
 
function grayScale(&$im) {
	$imgw = imagesx($im);
	$imgh = imagesy($im);
 
	for ($i=0; $i< $imgw; $i++) {
		for ($j=0; $j<$imgh; $j++) {
			// get the rgb value for current pixel
			$rgb = ImageColorAt($im, $i, $j);
 
			// extract each value for r, g, b
			$rr = ($rgb >> 16) & 0xFF;
			$gg = ($rgb >> 8) & 0xFF;
			$bb = $rgb & 0xFF;
 
			// get the Value from the RGB value
			$g = round(($rr + $gg + $bb) / 3);
 
			// grayscale values have r=g=b=g
			$val = imagecolorallocate($im, $g, $g, $g);
 
			// set the gray value
			imagesetpixel ($im, $i, $j, $val);
		}
	}
}
?>
kullanımı

resize.php?p=images/1.png&w=200&h=200

resize.php?p= resim yolu
&w= genişliği
&h= yüksekliği

şeklinde thumnail resimi oluşturup çağırabilirsiniz.