Translate Blog

18 Nisan 2013 Perşembe

Php İle Dizinde Bulunan Resimler Üzerine Toplu Yazı Yazmak

Dizinde bulunan yüzlerce resminiz olabilir, bunların hepsinin üzerine ayrı ayrı resim, logo veya yazı eklemek ihtiyacınız olabilir. Bunun için gidilecek yolu önce maddeler halinde yazayım. Yapmanız gereken şeyler;

  1. Kütüphane Kontrolü: Php GD kütüphanesi kullanarak resimleri işlemeniz lazım. Bu komutlarla resimleri düzenleyebilirsiniz. Muhtemelen kendi bilgisayarınızda localde kullanacağınız serverlarda bu kütüphane varmı yokmu kontrol edilmeli. Yoksa kurulmalı veya internetteki bir serverda denemelere devam edilmeli.
  2. Yazı Dizisi: Dizindeki resimlere yazdırılacak yazıları bir dizide tutacaksınız. Dizideki sıralama, server içindeki sıralama ile aynı olmalı. Bunun nasıl yapılabileceğinden bahsedeceğim merak etmeyin.
  3. Dizin Tarama ve Resim İşleme: Klasörünüzün içindeki resimleri taramak için kod kullanacağız, FAKAT KLASÖRDE RESİMDEN BAŞKA BİRŞEY BULUNMASIN. Her resim için GD kodları ile (imagecreatefromjpeg, imagecolorallocate, imagefill, imagecopyresampled, imagejpeg) düzenleme yapıp ilgili yazıyı resimlerimize yazdıracağız.
  4. Kayıt: İşlenen resimleri başka bir dizine aynı isimde kaydedeceğiz.
1. KÜTÜPHANE KONTROLÜ
Localde çalışıyorsanız aşağıdaki kodu bir php dosyasına yazıp çalıştırın.
<?php
phpinfo();
?>
Ekranda serverınıza ait bilgiler gelecektir. Burada aradığımız bilgi GD. GD Support  değerinin enabled yazıyor olması lazım. Yazmıyorsa veya GD ile alakalı birşey yok ise kurmalısınız. Nasıl olacak bilmiyorum :D Google amcaya sorun. İnternette bir serverınız varsa orada deneyin garanti açıktır.

2.YAZI DİZİSİ
Eğer elinizde 500 resim var ve bunlara 500 ayrı yazı yazmak istiyorsanız bu yazı dizisini oluşturmanız lazım.
Benim 532 dosyam var ve bu dosyaların her birine Türkçe karakterleri doğru yazılmış yazılar yazmak istiyorum. Bu yüzden bu resim belgelerinin Düzgün isimlerinin listesi lazım. Elinizle yazarsanız doğru sonucu elde edersiniz AMA YANLIŞ SIRADA. Yukarıda gördüğünüz sıralama işletim sisteminiz tarafından size gösterilen sıralamadır, fakat php kodu ile sıralama yaptığınızda yukarıdaki sırada resimleriniz sıralanmamaktadır.
Php ile sıralama kodu yazıp klasörünüzün belge isimlerinizi listelediğini zaman yukarıdaki gibi farklı sıralamalar elde edebilirsiniz. İşimizi garantiye almalıyız. Bunun için bir iki yazı önce bahsetmiş olduğum dizin sıralama kodlarını kullanacağız.

<?php
$dizi = array();
$dizin = "b/"; //dizininizin yolu
$ac = opendir($dizin);
while($x=readdir($ac)) {
if ($x != "." && $x != "..") {
$dizi[] = $x;
}
}
sort($dizi);

foreach($dizi as $x => $y) {
 echo $y."<br>";
}
?>

Yukarıdaki kodu bir php belgesine yapıştırıp, $dizin değişkeninizi de yolunuz olarak değiştirdikten sonra çalıştırın. Ekrana dizin listeniz gelecektir. Türkçe karakterleriniz bozuk geliyorsa Dreamweaver kullananlar için Page Propertiese'e girip Encoding değerini Türkçe yapmaları lazım. Sonuç şu şekilde;
Yukarıdaki listeyi kopyalayın ve excell'e yapıştırın. Amacımız bu isimlerin düzgün yazılmasını sağlamak veya resimlerin üzerine yazdıracağınız yazılar farklı yazılar ise bu belge içinde sırayla yanlarına yazmak istediğiniz metinleri yazabilirsiniz.


Ben siz görün diye formülü açık halini de yazmıştım. Bu excel belgesindeki amaç klasördeki aynı sırada bir metin dizisi elde etmek. Ve bu sayede metinleri dizindeki resimlerin üzerine aynı sırada yazdırabilmek. Tırnak işaretli metin satırlarınızı oluşturduysanız ki yukarıdaki ortadaki sütundan bahsediyorum, o sütunlarının tamamını kopyalayıp notpad veya varsa ki olsun notpad++ a yapıştırın.
'10 Kuruş',
'25 Kuruş',
'50 Kuruş',
'5 Kuruş',

Notpad programında yukarıdaki sarı kırmızı ile seçtiğim tırnak virgül ve alt satırdaki tırnağa kadar bir seçim yapın kopyalayın ve CTRL+H ile değiştir menüsünü açıp yapıştırın, yerine yine aynı işaretleri yazın ama elinizle. Amacımız ENTER kodunu ortadan kaldırmak ve hepsini yan yana yazdırmak aynı şu şekilde;
'10 Kuruş','25 Kuruş','50 Kuruş','5 Kuruş','Tl','Abla','Abla','Adım','Akrep','Akşam Yemeği',

Bu tarz bir liste elde ettiyseniz artık dizimiz hazır demektir. Şu kodu bir kenarda tutun bunu kullanacağız.
$etiket = array('10 Kuruş','25 Kuruş','50 Kuruş','5 Kuruş','Tl','Abla','Abla','Adım','Akrep','Akşam Yemeği',)

3. DİZİN TARAMA VE RESİM İŞLEME


  • Artık klasörünüzün içinde resimlerinizin bulunduğu bir klasör "a/". FAKAT KLASÖRDE RESİMDEN BAŞKA BİRŞEY BULUNMASIN.
  • Resimlerinizi son hallerini kaydedeceğiniz bir klasör "b/",
  • C:\Windows\Fonts klasörünüzden kopyalayıp yapıştırdığınız font belgeniz "verdanab.ttf", dışarıdan bulduğunuz başka bir ttf font dosyasını da koyabilirsiniz.
  • Ve dizin tarayıp resimleri metinlerle birleştirecek olan bir php dosyanız olmalı.
Bunlardan biri veya birkaçı yok ise hemen temin edin ;) Yemeğimizi pişirme zamanı geldi, aşağıdaki kodu kopyalayıp bir php dosyasına yapıştırın. 
<?php 
$etiket=array('10 Kuru?','25 Kuru?','50 Kuru?','5 Kuru?','Tl','Abla','Abla','Adym','Akrep','Ak?am Yeme?i');
//print_r($etiket);

$dizi = array(); 
$dizin = "a/"; 
$ac = opendir($dizin); 
while($x=readdir($ac)) { 
if ($x != "." && $x != "..") { 
$dizi[] = $x; 
} 
} 
sort($dizi);

// Bu kodlar dönüştürme işlemi uzun sürdüğü zaman serverın işleminizi iptal etmesini geciktiren kodlardır.
set_time_limit(10); 
ini_set('max_execution_time', 1000); // Buradaki 1000sn yi istediğiniz kadar uzatabilirsiniz. Ben 500 resim için 1.5dk bekledim. Fazla fazla süre verdim. Aksi halde işleminiz yarıda kalır 160 tanesini yaparsınız ve işleminiz kesilir. Resim işleme uzun bir süreçtir Unutmayın.


foreach($dizi as $x => $y) { 
 //echo $x.") ".$etiket[$x]." - ".$y."<br>";
 $font ='./verdanab.ttf'; //klasörümüe kopyaladigimiz boldlu font dosyasi
 $kaynak = "a/".$y; // resimleri alacagimiz dizin
 $resim = imagecreatefromjpeg($kaynak); //GD kodu ile resmimizi Ramde olusturuyoruz

 $yeniresim=imagecreatetruecolor(803,862); //GD kodu ile Daha büyük bir resim olusturuyoruz
 
 //kullanacagimiz renkleri tanimliyoruz
 $beyaz = imagecolorallocate($yeniresim, 255, 255, 255);
 $gri = imagecolorallocate($yeniresim, 128, 128, 128);
 $siyah = imagecolorallocate($yeniresim, 0,0,0); 
 //arkaplan rengimizi beyaz yapiyoruz
 imagefill($yeniresim, 0, 0, $beyaz);
 
 //yeni olusturdugumuz beyaz resim ile kaynaktan aldigimiz resimi birlestiriyoruz.
 //bu kodda resim yukaridan 94px bosluktan sonra ekrana yerlestirilmistir. En sondaki 2 deger resimin genislik ve yükseklik degerleridir.
 //
 imagecopyresampled($yeniresim,$resim, 0, 94, 0, 0, 803, 768, 803, 768);
 
 //yazilarin bulundugu diziden $etiket[$x] içinde bulunan yazidaki türkçe karakterleri UTF-8 yapiyoruz.
 $yazi= iconv("iso-8859-9","utf-8",$etiket[$x]); //türkçe karakter sorunu çözüldü
 
 //bu bir hizalama fonksiyonu, uzun aramalar sonucu denk geldim. Yazinizi ortalamak için kullabilirsiniz.
 hizala($yeniresim,40,0,0,63,$gri,$font,$yazi, $alignment='C');
 hizala($yeniresim,40,0,0,60,$siyah,$font,$yazi, $alignment='C');
 
 //Resminize yaziyi da ekledikten sonra artik bir yerlere kaydetmelisiniz. 
 //b/$y dedigimiz b dizininde $y ismiyle kaydedilecek bu resim.
 imagejpeg($yeniresim,"b/$y",100);

} 
closedir($ac); 


//yazıyı ortaya Hizalamak için bir fonksiyon. 

function hizala($image, $size, $angle, $x, $y, $color, $font, $text, $alignment='C') 
{ 
   //check width of the text 
   $bbox = imagettfbbox ($size, $angle, $font, $text); 
   $textWidth = $bbox[2] - $bbox[0]; 
   switch ($alignment) { 
       case "R": 
           $x -= $textWidth; 
           break; 
       case "C": 
           $x -= $textWidth / 2; 
           break; 
   } 

   //ekrana metni yazdır, ben metini resmin ortasında yazdırmak istediğim için 400 olan 
   //resmimin genişliğine -değer olan xi ekledim. ortalanmış oldu
   imagettftext ($image, $size, $angle, $x+400, $y, $color, $font, $text); 
} 
?>


Kodlar içine açıklamalar yazdım. Onları okuyarak nerenin ne işe yaradığını anlayabilirsiniz.
Yukarıdaki kodlarda öncelikle kelime dizimiz yazılmış. Ardından aynı dizin tarama kodu çalıştırılmış ve her bir resim için GD kütüphanesinin kodları kullanılarak resimlere dizininin içindeki bir kelime eklenmiş. Bu ekleme işlemi tam ortada yapılmış yani yazının resminizin ortasında durmakta. Bu hizalama olayı biraz sıkıntılı idi, araştırınca buldum. hizala isimli bir fonksiyon yazınızı alıp tam resminizin ortasına yazınızı eklemekte.

Kaydetme işlemide bu esnada yapılmakta.
imagejpeg($yeniresim,"b/$y",100);
Kodu ile. yeni oluşturulan resimi b dizininde eski ismi ile kaydetmiş oluyoruz.

Sonuç şu şekilde;

Yazının gölgesi olduğuna dikkati çekerim ;) Gd kodlarını araştırarak başka şeyler de yapabilirsiniz. Özellikle türkçe karakter destekleyen fontlar kullanın. Resim belgelerinizin isimlerinde boşluklar ve türkçe karkterler var ise problem yaşayabilirsiniz, yaşamamak için Tüm PHP belgeleriniz TÜRKÇE ENCODING yapılması gerekiyor. Yukarıda bahsetmiştim nasıl yapılacağından.

Benim kullandığım resim belge boyutları ile sizinkiler arasında farklar vardır. imagettftext ve imagecopyresampled


Komutlarında kullanılan koordinat, genişlik yükseklik bilgileri değiştirilmelidir. Hangisi hangisi olduğunu öğrenmek isterseniz googleda aratın php.net sitesinden çıkan yani ilk sonuçlara tıklayın hangisi hangisi orda yazıyor, ingilizce ama kolay gelsin (translate.google.com)

Yorum Gönder