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.