1 Haziran 2008Php ile resim thumbnail oluşturmak
Merhabalar yeniden elimden geldiğince kendimce makaleler eklemeye çalışıyorum. Bu gün öyle boş boş otururken bir resim sınıfı yapmak istedim. Öncelikle bir kağıt bir kalem aldım elime ve yazacağım sınıfın nelerden oluşacağını tasarladım.
Yaptığım plana göre resim sınıfım bana aşağıdaki beş öğeyi sunacaktı.
1- Verilen En değerine göre resimin boy’unu kendisi oranlaması.
2- Verilen Boy değerine göre resimin en’ini kendisi oranlaması.
3- Orantılama değeri yok ise direk olarak verilen değerlere göre thumb oluşturması.
4- Oluşturulan thumb resmini anında ekranda gösterebilmeli.
5- Watermark uygulama yapabilmesi
6- Oluşturulan thumb resmini betik ile aynı dizine veya başka bir dizine kaydedebilmesi.
Sınıfımızdaki fonksiyonların genel işlevlerine şöyle bir göz atalım isterseniz?
Sınıfımız bir __construct() yapılandırıcı ile çalışmaktadır. Bu yapılandırıcı ile sınıf başlatılırken bazı özellikleri de beraberinde ayarlaması için kullandım. Yani kendisine verilecek kaynak dosyayı mime tipine göre yeni bir resim oluşturması ve yine kendisine verilen kaynak resimin en boy ve mime tipini öğrenmek için $this->resim_info dizisine gerekli bilgiyi yükledim.
olustur() fonksiyonumuz ile kendisine kaynak gösterilen resmin mime tipine göre yani resmin türüne göre (JPG,GIF,PNG) yeni bir resim oluşturduk.
resim_bilgileri() adlı fonksiyonumuz ile de bize kaynak gösterilen resmin en boy ve türünü alıp dizi değer olarak değer döndürdük ve bu dönen değeri resim_info adlı dizi değişkenimize aktardık.
resize() fonksiyonu sınıfımızın büyük bir kısmını oluşturmakta. bu fonksiyonumuz üç parametre almaktadır. bunlar;
- width: istenilen yeni resim en değeri.
- height: istenilen yeni resim boy değeri.
- oran: resmin en veya boy değerine göre orantılanması veya oran değeri verilmeyerek direk istenilen ölçülerde thumb oluşturulması.
Oran parametremiz ise üç değişik seçenek almakta. Bunlar EN, BOY ve YOK şeklinde.
EN parametresi verildiğinde resize fonksiyonuna bir width değeri girilmelidir. Girilen width değerine göre height değerini kendisi oranlayacaktır.
BOY parametresi verildiğinde resize fonksiyonuna bir height değeri girilmedir. Girilen height değerine göre width değerini kendisi oranlayacaktır.
YOK parametresi girildiğinde ise resize fonksiyonuna width ve height girilmelidir. Girilen bu değerler orantılanmaksızın direk verilen değerlerde thumbnail oluşturacaktır.
watermark() fonksiyonumuz ise kendisine verilen bir x.png adlı dosyayı orjinal resim dosyamızın üstüne kopyalamaktadır. ( örneğin ürün tanıtım sayfalarınız da ürün resimlerinizi korumak için kullanabilirsiniz. )
kaydet() fonksiyonumuz ise artık verilen kriterlere göre oluşturulan yeni thumnail resmi verilen bir dosya adı ile ilgili dizine kaydeder.
goster() fonksiyonu ise oluşturulan resmi direk ekrana çıktı olarak basar.
hata() fonksiyonu ise herhangi bir olası durumda ilgili metini yazarak betiği durdurur.
Sınıfımızın genel çalışma prensibi bu şekilde. Aşağıda örnek bir uygulama göstereceğim.
index.php dosyamızdaki $durum = 1; değişkenine bir ile beş arasında değer vererek diğer özelliklerini görebilirsiniz.
URL deki durum degerine bir ile beş arasında değer vererek online olarak örneğimize buradan bakabilirsiniz.
Php ile resim thumnail oluşturmak adlı sınıfımızı ise buradan inderebilirsiniz.
örnek index.php dosyamız:
< ?php /** * YSF_Image sınıf denemeleri * Author: Yusuf KOÇ ( Raiden ) < yusufkoc at ayva dot net > * Web: http://www.ysfkc.com **/ # Resim Sınıfımızı dosyamıza dahil ediyoruz # ------------------------------------------- include_once('resim.php'); # Resim Sınıfımız başlatılıyor # ----------------------------- $resim = new YSF_Image('avril.jpg'); /** * @param durum * 1: EN parametresi örneği * 2: BOY parametresi örneği * 3: YOK parametresi örneği * 4: WATERMARK uygulaması * 5: Oluşan Resmi Kaydetmek **/ $durum = 1; switch ($durum): case 1: # Resim EN orantı parametresine göre boy orantılanarak ekrana basılıyor # ---------------------------------------------------------------------- $resim->resize(800,0,'EN'); $resim->goster(); break; case 2: # Resim BOY orantı parametresine göre en orantılanarak ekrana basılıyor # --------------------------------------------------------------------- $resim->resize(0,500,'BOY'); $resim->goster(); break; case 3: # Resim YOK orantı parametresine göre yeni thumb oluşturuluyor # ------------------------------------------------------------- $resim->resize(900,500,'YOK'); $resim->goster(); break; case 4: # Resime WATERMARK uygulanıyor. # ------------------------------------------------------------- $resim->resize(800,0,'EN'); $resim->watermark('logo.png'); $resim->goster(); break; case 5: # Oluşan resme watermark uyglayıp yeni bir isim vererek kaydettik. # ------------------------------------------------------------------ $resim->resize(700,0,'EN'); $resim->watermark('logo.png'); $resim->kaydet('yeni_olusan.jpg'); break; endswitch; ?>
resim.php dosyamız:
< ?php /** * Author: Yusuf KOÇ ( Raiden ) < yusufkoc at ayva dot net > * Web: http://www.ysfkc.com * * @YSF_Image: * Kendisine verilen resim dosyasını istenilen ölçülerde yeniden düzenleyerek yeni bir thumbnail oluşturur. * * @YSF_Image Sınıfının Kullanımı Hakkında Detaylar: * YSF_Image::resize() fonksiyonu 3 değişik parametre alır. Bunlar; * EN : Oluşturacağınız yeni thumb için en oranını verirsiniz betik kendisi resim boyunu otomatik olarak orantılacaktır. * BOY : Oluşturacağınız yeni thumb için boy oranını verirsiniz betik kendisi resim en'nini otomatik olarak orantılacaktır. * YOK : En ve Boy oranlarını direk verirsiniz ve betik kendisi verilen ölçülerde yeniden boyutlandırır. * * YSF_Image::goster(): * Bu fonksiyon oluşturulan thumb resmini ekrana basar. * * YSF_Image::watermark(): * Bu fonksiyon oluşturulan thumb resim üzerine logo eklemenize olanak sağlar. Bunu yapabilmek için elinizde bir örneğin logo.png olmalıdır. * * YSF_Image::kaydet(): * Bu fonksiyon oluşturulan yeni thumb resmi istediğiniz dizin yada betik ile aynı dizine kaydeder. **/ class YSF_Image { private $imaj; private $temp; private $resim_info = array(); private $en; private $boy; private $tmp_en; private $tmp_boy; private $katman; # Construct Fonksiyon # ------------------------ public function __construct($images) { if (file_exists($images)) { $this->imaj = $this->olustur($images); $this->resim_info = $this->resim_bilgileri($images); } else { $this->hata('Dosya Yolunu Doğru Olarak Belirtiğinizden Emin Olunuz.'); } } # Resim Bilgileri Alınıyor # -------------------------- private function olustur($images) { $this->temp = getimagesize($images); switch ($this->temp['mime']) { case 'image/pjpeg': return imagecreatefromjpeg($images); unset($this->temp); break; case 'image/jpeg': return imagecreatefromjpeg($images); unset($this->temp); break; case 'image/png': return imagecreatefrompng($images); unset($this->temp); break; case 'image/gif': return imagecreatefromgif($images); unset($this->temp); break; } } # Resim Boyutları Öğreniliyor.. # ------------------------------ private function resim_bilgileri($images) { $this->temp = getimagesize($images); return array('en' => $this->temp[0], 'boy' => $this->temp[1], 'mime' => $this->temp['mime']); unset($this->temp); } # Resim Boyutlandırılıyor # ------------------------ public function resize($width, $height, $oran) { if ($oran == null) { $oran = 'YOK'; } else { if ($oran == 'EN') { $this->tmp_boy = (($width / $this->resim_info['en']) * $this->resim_info['boy']); $this->en = round($this->resim_info['en'] * $this->tmp_boy / $this->resim_info['boy']); $this->boy = round($this->resim_info['boy'] * $width / $this->resim_info['en']); if (($this->tmp_boy - $this->boy) < ($width - $this->en)) { $width = $this->en; $height = $this->boy; } else { $height = $this->boy; } $this->temp = imagecreatetruecolor($width, $height); imagecopyresampled($this->temp, $this->imaj, 0, 0, 0, 0, $width, $height, $this->resim_info['en'], $this->resim_info['boy']); } elseif ($oran == 'BOY') { $this->tmp_en = (($height / $this->resim_info['boy']) * $this->resim_info['en']); $this->en = round($this->resim_info['en'] * $height / $this->resim_info['boy']); $this->boy = round($this->resim_info['boy'] * $this->en / $this->resim_info['en']); if (($this->tmp_en - $this->en) < ($height - $this->boy)) { $width = $this->en; $height = $this->boy; } else { $width = $this->en; } $this->temp = imagecreatetruecolor($width, $height); imagecopyresampled($this->temp, $this->imaj, 0, 0, 0, 0, $width, $height, $this->resim_info['en'], $this->resim_info['boy']); } else { if (($this->resim_info['en'] < $width) && ($this->resim_info['boy'] < $height)) { $width = 100; $height = 75; } $this->temp = imagecreatetruecolor($width, $height); imagecopyresampled($this->temp, $this->imaj, 0, 0, 0, 0, $width, $height, $this->resim_info['en'], $this->resim_info['boy']); } } } # Watermark Uygulaması # ----------------------- public function watermark($images) { if (!file_exists($images)) { $this->hata('Watermark Dosya Yolunun Doğru Olduğundan Emin Olunuz!'); } $this->katman = imagecreatefrompng($images); $this->en = imagesx($this->katman); $this->boy = imagesy($this->katman); imagecopy($this->temp, $this->katman, ((imagesx($this->temp) - $this->en) / 2),((imagesy($this->temp) - $this->boy) / 2), 0, 0, $this->en, $this->boy); } # Oluşturulan Resmi Kaydet # --------------------------- public function kaydet($images) { if ($this->resim_info['mime'] == 'image/pjpeg' or $this->resim_info['mime'] =='image/jpeg') { imagejpeg($this->temp, $images); unset($this->temp); } if ($this->resim_info['mime'] == 'image/gif') { imagegif($this->temp, $images); unset($this->temp); } if ($this->resim_info['mime'] == 'image/png') { imagepng($this->temp, $images); unset($this->temp); } } # Oluşturulan Resmi Göster # -------------------------------- public function goster() { header('Content-type:' . $this->resim_info['mime']); if ($this->resim_info['mime'] == 'image/pjpeg' or $this->resim_info['mime'] =='image/jpeg') { imagejpeg($this->temp); unset($this->temp); } if ($this->resim_info['mime'] == 'image/gif') { imagegif($this->temp); unset($this->temp); } if ($this->resim_info['mime'] == 'image/png') { imagepng($this->temp); unset($this->temp); } } # Hata Durumunda Ekrana Uyarı Yaz # ---------------------------------- private function hata($text) { exit($text); } } ?>


sen bana anlatımım pek iyi değil demiştin sanki,yanlış hatırlamıyosam
ama cok güzel anlatmışsın
teşekkür ederim serkan evet hala iyi olmadığımı biliyorum
usta elinbe sağlik çok güzel bir sınıf benim sorunum
1mb lık resimleri çevirmedi
birde watermark uygulamısı resmin ortasına yapılıyor ben onu resmin sol altına yapmak istiyorum… php acemiyim…
Sınıfın watermark metodunu incelerseniz orda ortalamak için bir kaç işlem yapıldığını görürsünüz orası ile oynayarak istediğiniz sonucu elde edebilirsiniz. Bu ara işlerimin yoğunluğu nedeni ile pek vakit ayıramıyorum.
ayrıca IE özel olarak alpha opacity yi kullanarak web 2.0 tarzında da thumbnail oluşturulabilir. mozilla ve opera da çalışmıyor yanlız.
Teşekkürler. Çok işime yarayacak.
[...] [...]
resmin üzerine logo değilde yazı yazdırıp farklı thumb olarak kaydetmek için ne yapmamız gerekiyor
guzel çalışma .. ama şunları söylemek istiyorum
returndan sonra yaptığınız unsetler. ve image objesine işlediğiniz unsetler işe yaramıyor. imagedestroy() kullanmalısınız image i bellekten silebilmek için.. fonksiyon içindeki unsetlerin de onemi yok cunku fonksiyondan cıktıktan sonra zaten ramde eleman bırakmaz hiç bir dil.
başarılarınızın devamını dilerim..
Fatal error: Alleowed memory size of 8388608 bytes exhausted (tried to allocate 8192 bytes) in C:\AppServ\www\thmb\resim.php on line 62
Yukarıdaki sorunun neden kaynaklandığını ve çözümünü belirtebilrseniz sevinirim. Saygılar..
php.ini de upload_max_file ve post_max_filesize gibi upload edilceek dosyanın boyutunu tutan bir satır olması gerekiyor ikisinin de boyutunu artırıp yeniden deneyiniz.
Selam,
Size ait fonksyonu kullanıyorum fakat, gif yada resimlerde transparan olan resimlerin özellikleri bozuluyor ve gif anımasyonların anımasyon özelliği gidiyor. Bu konu hakkında yardımcı olabilirmisiniz acaba ?
Teşekkurler bu arada.
İyi çalışmalar.
Selam ,
Sizden cevap bekliyorum hocam, pek bi bilgim yok php ve gd kütüphanesi konusunda. Yardımcı olursanız sevinirim.
Teşekkürler.
Selam,
Daha önce soru sormuşdum ama hala cevap alamadım bilginiz yada bilgisi olan varmı bu konu hakkında ? Tüm sistemi bu Class üzerine yazdım şimdi değiştirmek baştan çok zaman alıcak.
Sorum şuydu ;
Size ait fonksyonu kullanıyorum fakat, gif yada grafikde transparan olan resimlerin özellikleri bozuluyor ve gif anımasyonların anımasyon özelliği gidiyor. Bu konu hakkında yardımcı olabilirmisiniz acaba ?
Teşekkürler.
Merhabalar Sınıf için Teşekkürler ellerinize sağlık oldukça kullnışı olmuş…
Bir Kaç sorum olacak ; Resim yüklenirken boyut sınırlamasını nasıl ekleyebiliriz ?
ve bmp uzantılı resimler için nasıl bi ekleme yapmalıyız bi kaç deneme yaptım ancak sınıflarla ilgili çok fazla bi bilgim yok maalesef