31 Jan

PHP ile resim üstüne yazı yazdırmak

Uzun zamandır yazmıyorum bloguma, bugün bunun acısını çıkarırcasına , yazmak isteyip de, vakit bulamadığım konular üzerine yazıyorum 🙂
Bildiğiniz veya artık bundan sonra bileceğiniz gibi, php ile resim işlemleri de yapabilmekteyiz. PHP nin resim işlemleri için birkaç eklentisi var. Fakat ben örneğimde GD kütüphanesini baz alacağım.
Burdaki amacımız elimizde bulunan bir resim üzerine istediğimiz bir yazıyı yazdırabilmek. Bunu yapabilmek için GD eklentimizi kurmamız gerekir. GD kütüphanesini kurduktan sonra yazacağımız birkaç satırlık kod ile rahatlıkla istediğimiz şeyi gerçekleştirebileceğiz :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// resmimizi oluşturuyoruz
$resim=imagecreatetruecolor(200,50);
// resmimizi boyayacağımız rengi oluşturuyoruz
$renk = imagecolorallocate($resim, 176,196,222);
// resmimizi boyuyoruz
imagefill($resim, 0,0, $renk);
// yazı rengimizi belirtiyoruz
$yaziRengi = imagecolorallocate($resim, 0,0,0);
// yazımızı resmin üstüne yazıyoruz
imagestring($resim, 5, 20, 50/3, 'www.ersindogan.com', $yaziRengi);

// tarayıcıya dosyamızı algılaması için direktif veriyoruz
header('Content-type: image/png');
// ve sonucu çıktılıyoruz
imagepng($resim);
imagedestroy($resim);

Burada ek olarak bahsedeceğim şey iamgestring işlevi. Aslında bu işlev tam olarak yazımızın konusu, yani resim üzerine yazı yazmamızı sağlayan işlev.
Bu işlevdeki ilk parametre üzerine yazı yazılacak resimdir .
İkinci parametre yazı yazmak için kyllanacağımız font tipini belirtiyoruz. 1 den 5 e kadar latin2 kodlamalı yerleşik yazı tiplerini seçebilir veya imageloadfont metodu ile kendi fontumuzu kullanabiliriz.
Üçüncü ve dördüncü parametreler yazının koordinatlarını (x,y) belirtmek için kullanılır.
Beşinci parametre resmi üzerine yazılacak metin.
Altıncı parametre ise yazı rengini belirler.
Yuarıdaki kodun çıktısı aşağıdaki gibi olacaktır :

php-ile-resim-ustune-yazi

Eğer kodları aşağıdaki biçimde değiştirisek :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// rengimizi oluşturuyoruz
$resim=imagecreatetruecolor(50,250);
// resmimizi boyayacağımız rengi oluşturuyoruz
$renk = imagecolorallocate($resim, 176,196,222);
// resmimizi boyuyoruz
imagefill($resim, 0,0, $renk);
// yazı rengimizi belirtiyoruz
$yaziRengi = imagecolorallocate($resim, 0,0,0);
// yazımızı resmin üstüne yazıyoruz
imagestringup($resim, 5, 10, 220, 'www.ersindogan.com', $yaziRengi);

// tarayıcıya dosyamızı algılaması için direktif veriyoruz
header('Content-type: image/png');
// ve sonucu çıktılıyoruz
imagepng($resim);
imagedestroy($resim);

Bu sefer de aşağıdaki gibi bir çıktı alırız

php-ile-resim-ustune-dikey-yazı-yazdırmak

Aslında beni en çok uğraştıran, ama çözümü gözümün önünde duran, resim üzerine yazılan yazının saydamlığını ayarlayabilme konusuna bir sonraki yazıda değineceğim.

Buradaki örnekleri geliştirerek kendinize uygun çözümler oluşturabilirsiniz. Hoşça kalın

30 Jan

iconv ile karakter kodlama

Birçoğumuz ya kullanmışızdır, ya da gerçekten çok ihtiyaç duyup çözüm aramışızdır. Başka bir karakter setinde olan metni diğer bir karakter setine geçirmek. Bunun için çok kolay bir yöntem var “iconv”.
iconv phpnin karekter setleri arasında çevrim yapmaya olanak veren yararlı bir fonksiyonu.

1
string iconv(string $kodlamadan,string $kodlamaya,string $metin)

biçiminde kullanılır. iconv kullanırken dikkat edilmesi ve göz önünde bulundurulurması gereken en önemli nokta, karakter kümesinin karşılığını bulamadığı karakterde ne yapacağını belirtmektir.
Şöyle ki : iconv çevrim yaparken diğer karakter setinde bulamayacağı karakterler vardır ( örneğin Türkçe de ? ? benzeri karakterler yoktur), bu tür karakterlere denk geldiğinde ön tanımlı olarak bu karakterden sonrasını es geçer ve Notice verir. Bunun önüne geçebilmek için çevrim yapılması istenen karakter setini belirtirken “//TRANSLIT” kelimesinin eklememiz gerekir. Böylece o karakter setinde olmayan, ama karşılığı olan karaktere çevrilir .
PHP kendi sitesinde verdiği örnek üzerinden gidersek :

1
2
3
4
5
6
$text = "'?' simgesi Euroya aittir";

echo 'Original : ', $text, PHP_EOL;
echo 'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text), PHP_EOL;
echo 'IGNORE   : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $text), PHP_EOL;
echo 'Plain    : ', iconv("UTF-8", "ISO-8859-1", $text), PHP_EOL;

Çıktısı aşağıdaki gibi olacaktır

Original : ‘?’ simgesi Euroya aittir
TRANSLIT : ‘EUR’ simgesi Euroya aittir
IGNORE : ” simgesi Euroya aittir
Notice: iconv(): Detected an illegal character in input string in .\index.php on line 6
Plain : ‘
Notice: iconv(): Detected an illegal character in input string in .\index.php on line 7

iconv çok yararlı bir fonksiyondur, karakter setleri arasında çevrim yapmak istediğinizde işinizi oldukça kolaylaştıracak bir fonksiyondur.
Elimden geldiğince kullanımına dair birşeyler paylaşmak istedim. işinize yaraması umudu ile, hoşça kalın.

30 Jan

lighttpd’nin dayanılmaz hafiliği

Apache’den gayrı sunucu bilmezdim, taaki lighttpd ye işim düşene kadar. Ve gördüm ki gerçekten adı kadar hafif bir sunucu imiş. Sadece 762 kb olan bu sunucuyu kurup , php ile bağını kurmak hiç de zor olmadı. Kendi sitesinden indirdiğiniz dosyayı bir klasöre açtıktan sonra geleneksel kurulum yöntemleri ile kuruyoruz : Dosyaları açtığımız dizine gidip ;

1
2
3
./configure
make
make install

diyerek kurulumu tamamlıyoruz. Geleneksel kuruluma ek olarak, istediğim klasöre kurulabilmesini sağlayabilmek için :

1
2
3
./configure --prefix=/home/ersin/lighttpd
make
make install

demek yetiyor. Bundan sonra lighttpd yi ayarlayabilmek için gerekli ayar dosyasını oluşturmaya geldi sıra. Kurulum işlemi tamamlandığında lib,sbin ve share klasörleri oluşturacaktır ( eğer yukarıdaki prefix parametresini kullanıp farklı bir dizine kurdurduysanız) . Kurulum yaptığımız lighttpd klasörüne giderek burada www klasörü oluşturalım.

Kurulumu yukarıdaki komut satırındaki kuruluma göre , farklı bir dizine yapılmış kurulum olduğunu kabul ederek devam edelim.
sbin klasörüne girerek lighttpd.conf adında bir dosya oluşturalım. Bu dosyanın içerisine girerek şu satırları yazalım :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
server.document-root = "/home/ersin/lighttpd/www/"
server.port = 8080
server.modules              = (
                                "mod_rewrite",
#                               "mod_redirect",
#                               "mod_alias",
#                               "mod_access",
#                               "mod_cml",
#                               "mod_trigger_b4_dl",
#                               "mod_auth",
#                               "mod_status",
#                               "mod_setenv",
                                "mod_fastcgi",
#                               "mod_proxy",
#                               "mod_simple_vhost",
#                               "mod_evhost",
#                               "mod_userdir",
#                               "mod_cgi",
#                               "mod_compress",
#                               "mod_ssi",
#                               "mod_usertrack",
#                               "mod_expire",
#                               "mod_secdownload",
#                               "mod_rrdtool",
#                               "mod_accesslog"
)
index-file.names = ( "index.php","index.html" )
mimetype.assign = (
".html" => "text/html",
".txt" => "text/plain",
".jpg" => "image/jpeg",
".png" => "image/png"
)

Yuarıdaki kodlar üç aşşağı beş yukarı anlaşılır şeyler. Ama yine de tek tek değinelim.
server.document-root sunucumuzda yayınlanacak olan dosyalar için kök klasörü işaret eder. Bu klasöre atılan dosyaya web den erişilebilir (bunu kendi kurulumunuza göre değiştirin) .
server.port sunucumuzun çalışacağı port. Genelde 80 dir ama, zaten bir sunucunuz olduğunu düşünerek lighttpd yi denerken muhtemel bir problemden uzak tutmak için 8080 girdik.
index-file.names sunucumuzun kök klasöre eriştiğinde bakacağı index dosyasını belirlememizi sağlar.
mimetype.assign uzantılar ile MIME tipi ilişkilendiriyoruz.
Şimdi sıra geldi php yi tanıtmaya. Lighttpd de PHP yi kurabilmek için php-cgi kurmamız gerekmekte.
Ben ubuntu kullandığım için ubuntuya göre kurulumu anlatacağım.

1
apt-get install php5-cgi

gibi tek satır kod ile php5-cgi kurduktan sonra lighttpd.conf a aşağıdaki satırları ekliyoruz

1
2
3
4
5
6
7
8
9
10
11
fastcgi.server = ( ".php" =>
(( "socket" => "/tmp/php-fastcgi.socket",
"bin-path" => "/usr/bin/php-cgi",
"max-procs" => 10,
"bin-environment" => (
"PHP_FCGI_CHILDREN" => "10",
"PHP_FCGI_MAX_REQUESTS" => "500"
),
"broken-scriptfilename" => "enable"
))
)

Bu satırları da ekledikden sonra sıra geldi lighttpdyi çalıştırmaya. Tabi bundan önce www dizinimizde index.php dosyası oluşturup içerisine

1
phpinfo();

yazarak kaydetmeliyiz. Böylece php kurulumunu test edebiliriz.
Hadi lighttpd yi çalıştıralım, ilk önce konsoldan kurulumu yaptığımız dizindeki sbin klasörüne giriyoruz. Burda :

1
./lighttpd -D -f lighttpd.conf

yazarak lighttpd yi çalıştırıyoruz ( lighttpd.conf dosyasını kolaylık olsun diye sbin klasörünün içerisinde oluşturmuştum ) . Buradaki “D” parametresi lighttpd nin arka plana geçerek orda çalışmasını engeller. Böylece komut satırından “CTRL+C” ile işlevi sonlandırdığınızda lighttpd çalışmayı durdurur, “D” parametresini eklemezsek “CTRL+C” ile lighttpd yi durduramayız. “f” parametresi hangi config dosyasını kullanacağımızı belirtmek için.
Bu komutu çalıştırdıktan sonra
“2010-01-30 18:10:51: (log.c.166) server started”
benzeri bir çıktı verecektir. Bu da lighttpd nin çalıştığı anlamına gelir. Artık tarayıcı ekranından http://localhost:8080 dedikten sonra php bilgisi dökülecektir ekrana.
İlerleyen zamanlarda lighttpd ile ilgili tecrübelerimi burada paylaşmaya çalışacağım. Güzel günler dileği ile, hoşça kalın.