PHP - Dersleri - 4

Abdullah Şahin

Altın Üye
Altın Üye
Kayıt
3 Nisan 2008
Mesaj
2.630
Tepki
89
header:

Header nedir? Anlamı başlık ama ne ifade ediyor. Biliyorsunuz biliyorum, bir dosya ile ilgili çeşitli "karakteristik" bilgileri barındıran ve bu dosyanın kendi içerdiği verilerden önce gelen kısım bu başlık kısmı.

Aslında HTTP protokolü için konuşuyoruz ve bizim bahsettiğimiz header da aslında Grafiker Amcalar'dan biri değil. Header fonksiyonu genel olarak istemciye gönderdiğiniz içeriğin tamamından önce giden, karakter seti, gönderilen dosya tipi, önbellek davranışları gibi bir çok konuda bilgi içerek kısım. Bizim için header amcalar arasında önemli yer tutuyor.

Kısaca header'ı istemcinin web görüntüleyicisine bir resim çıktısı gönderdiğimizi bildirmek için kullanıyoruz. Bunu da HTTP başlıklarından Content-type parametresi ile belirliyoruz. Mesela;

PNG için: Content-type: image/png
JPEG için: Content-type: image/jpeg

Bir parantez açarak size üzücü birşeyler söylemek zorunda hissediyorum kendimi. Ne yazık ki GD kütüphanesinden eski GIF desteğini kaldırdılar. Bunun için GD ekibini suçlayamayız. Onlar da bizim gibi üzgünler... Neden kaldırdıklarını merak ettiğinizin farkındayım, ben de merak ediyorum... :)

Şaka şaka, söyleyeceğim tabiki nedenini; GIF formatının temelini oluşturan sıkıştırma algoritmasının lisansı özgür / free olmadığı için çıkarmak zorunda kaldılar. Ama üzülmeyin GIF ne kadar yetenekli ise PNG GIF'in sağladıklarını 3e 5e 10a katlar diyebilirim. Yani son durum şöyle: GIF okuyabiliyor ama yazamıyoruz. Parantezimi de kapatıp konuya dönüyorum...

imagecreate:

Kafanızda birşeyler oluşmaya başlıyor değil mi? Oluşmuyor mu? Hiç sorun değil çünkü daha erken zaten. Ama imagecreate fonksiyonunun size çok şey ifade ettiğinin farkında olduğumu söylemeden edemeyeceğim. Evet, doğru tahmin ediyorsunuz bir resim oluşturmak için kullanıyoruz bu fonksiyonu. 2 parametresi var birincisi oluşturacağımız resmin genişliği ve ikincisi de yüksekliği. Her ikisi de nokta (pixel) cinsinden.

imagecreate( Genişlik, Yükseklik )

Bu amcamızın daha sık kullanacağımız bir küçük kardeşi var o da;

imagecreatetruecolor:

imagecreatetruecolor'un sevgili ağabeyi imagecreate'in renk konusunda kısıtları gibi bir kısıtlaması yok. Yani oluşturduğumuz resimler 32bit oluyorlar. Yani 16 milyon renk, yani yani 255*255*255 renk. Ama imagecreate amcamız 8bit yani 256 renk sağlıyor bize. O yüzden tercihlerimizi yaparken bunu gözönünde bulundursak iyi ederiz... Kullanılışı da aynı:

imagecreatetruecolor( Genişlik, Yükseklik )

Bir resim oluşturduğumuz zaman, üzerinde çeşitli işlemler yapabilmek ve bunları kaydedebilmek için bu resmi bir değişkende saklıyoruz. Bunu da oluşturma fonksiyonunu kullandığımız zaman atama yaparak sağlıyoruz.

Şimdi bakalım, önce dosya türümüzü belirten header bilgisini belirledik sonra da bir değişkene boyutları belli bir resim yükledik. Peki şimdi ne yapmamız gerekiyor? Elbette işimizi bitirince bu resmi çıktı olarak göndermek veya kaydetmek gerekiyor. Bunun için elimizde bir takım amcamız var ve hepsi de 1 zorunlu 1 de alternatif parametre alıyor. İlk parametre tahmin edeceğiniz gibi çıktısını alacağımız veya kaydedeceğimiz resim değişkeni, diğeri de eğer kaydedeceksek dosya adı. Dosya adı parametresini verirsek bize çıktı vermeyeceğini de belirtirsem sanırım ilerde oluşma potansiyeli olan sorunların önüne geçmiş olurum :) Haa bu arada hemen hatırlatayım, resmi istemci tarafına kaydetmiyor sunucu tarafına kaydediyor.

GIF - imagegif: Content-type: image/gif
JPEG - imagejpeg: Content-type: image/jpeg (imagejpeg 3. bir parametre alabiliyor. kaydedilen dosyanın kalite değeri olarak 0-100 arası bir değer bu, varsayılan değeri 75)
PNG - imagepng: Content-type: image/png

vee bir de WAP için

WBMP - imagewbmp: Content-type: image/vnd.wap.wbmp (bu amcamız da 3. bir parametre alabiliyor. bu da resmin ön plan rengi, belirtmezsek siyah oluyor.)


İşte böyle... Kafanızın iyice bulandığını görüyor ve çorbada tuzum olmasını istiyorum. Yani bir örnek verme zamanımız geldi:

sevgili_grafiker_amcalar-1.php:
<?

header("Content-type: image/png");

$tual=imagecreate(250,75);

imagepng($tual);

?>


deneme-1.html:
<html>
<body>
<img src=sevgili_grafiker_amcalar-1.php>
</body>
</html>


Anlıyorsunuz değil mi? sevgili_grafiker_amcalar-1.php resmin kendisi çıktı olarak gönderiyor biz de onu web sitemizde (deneme-1.html) istediğimiz yerde görüntülüyoruz, herhangi bir resimmiş gibi...

Hadi biraz renk katalım ve bir kaç çizgi ekleyelim ha? Hatta bir de yazı yazalım...

imageline:
Evet, çizgi çizmek için kullanıyoruz bu amcayı. Parametreler neler bir bakalım:

imageline( ResimDeğişkeni, X1, Y1, X2, Y2, ÇizgiRengi )

Resmimizde 0,0 koordinatı sol üst köşeyi ifade ediyor ve X1,Y1'den başlayıp X2,Y2'de biten bir çizgi çizdiriyoruz. Burada önemli olan nokta ÇizgiRengi. Rengi resmin paletinden seçmemiz gerekiyor.

Soru: Bunu nasıl yapıyoruz??
Cevap: Bu güzel soru için seni tebrik ediyorum!!

imagecolorallocate:
Grafiker amcalarımızın ellerinde, tuallerini boyamak için kullandıkları boyaların bulunduğu paletleri var. Bu paletler bazen limitli olabiliyorlar. Ayrıca siz bu paletin üzerine istediğiniz renkten boya koymazsanız grafiker amcalarımız renk körü olacaklar. Biliyor musunuz siz palete hiç renk koymazsanız da kör olurlar :)

imagecolorallocate fonksiyonu 4 parametre alıyor, ilk parametre tahmin ettiğiniz gibi resim değişkeni. Diğer üçü de sırasıyla RGB değerleri, yani Kızmızı-Yeşil-Mavi değerlerini belirterek istediğimiz rengi vermiş oluyoruz. Fonksiyonun döndüğü değer rengin paletteki sırasını belirtiyor. Bunu bir değişkende saklayarak istediğimiz zaman kullanabiliriz.

imagecolorallocate( ResimDeğişkeni, R, G, B )

Bu arada bu fonksiyonla ilgili çok önemli bir detayımız var. imagecolorallocate'i bir resim için ilk defa çağırdığımızda tanımladığımız renk, arkaplanımızın rengi oluyor. Yani beyaz fon istiyorsanız imagecolorallocate ile ilk olarak 255,255,255 değerini çağırmalısınız.

imagestring
Eeeeevet... Sıra yazı yazmaya geldi :) Bu amcamız sayesinde resmin istediğimiz yerine yazı yazmamız mümkün. Bakalım nasıl kullanılıyormuş;

imagestring( ResimDeğişkeni, FontNo, X, Y, Metin, ÇizgiRengi )

FontNo yazının yazılacağı yazıtipi'nin numarasını, X ve Y parametreleri yazının yerleştirtirileceği yeri, Metin parametresi de yazımızı belirtiyor. ÇizgiRengi ve ResimDeğişkenini zaten tanıyorsunuz. Tanımıyor musunuz? O zaman sizi biraz daha yukarılara gönderiyorum ^-^

"Herşey tamam ama bu FontNo neyi ifade ediyor?" dediğinizi duyar gibiyim. İlk gördüğümde ben de aynı soruyu sordum, boş yere aşağılık duygusuna kapılmayın :)

FontNo ile belirtilen sayı ile yazıtipini seçiyoruz. 1-5 arasında önceden tanımlı yazıtiplerini ifade ediyor. imageloadfont fonksiyonu ile başka yazıtipleri yükleyebilirsiniz ama bunlar bildiğimiz TTF(TrueTypeFont)'lar değiller. GD'nin kendi özel binary yazıtipleri. Bu konuya fazlaca girmeyeceğim, şimdilik kafa karıştırmaya gerek yok ama zaten araştırmacı ruhlara bir ipucu verdiğimi sanıyorum...

imagefontwidth ve imagefontheight:

FontNo olmak üzere tek parametre alan bu fonksiyon ile sözkonusu yazıtipinde her bir karakterin kaç nokta (pixel) boyutunda olduğunu öğrenebiliyoruz. Bunun ne yararı var demeyin. Zira yazıların resme ortalanması gibi durumlarda hayat kurtarıcı olacak :)

imagefontwidth( FontNo )
imagefontheight( FontNo )

"Gel-gelelim" örnek zamanımız gelmiş... Hemencecik karıştıralım çorbaya tuzumuzu, derinlere dalarken karnımızın zil çalması hiç de hoş olmazdı, değil mi? :p

sevgili_grafiker_amcalar-2.php:
<?

header("Content-type: image/png");

$tual=imagecreate(250, 75);

$beyaz=imagecolorallocate($tual, 255, 255, 255);
$siyah=imagecolorallocate($tual, 0, 0, 0);
$kirmizi=imagecolorallocate($tual, 255, 0, 0);

$metin="Hebele Hübele";
$metinGenisligi= imagefontwidth(3) * strlen($metin);
$metinYuksekligi= imagefontheight(3);

$x=(250 - $metinGenisligi) / 2;
$y=(75 - $metinYuksekligi) / 2;

imagestring($tual, 3, $x, $y, $metin, $siyah);

$x1=$x - 10;
$y1=$y + $metinYuksekligi + 5;
$x2=$x + $metinGenisligi + 10;
$y2=$y1;

imageline($tual, $x1, $y1, $x2, $y2, $kirmizi);

imagepng($tual);

?>


deneme-2.html:
<html>
<body>
<img src=sevgili_grafiker_amcalar-2.php>
</body>
</html>


Fonu belirlediği için ilk olarak beyazı tanımladığımı farkettiniz değil mi? Metin genişliği ve yüksekliğini hesaplayıp yazıyı ve çizgiyi ortaladığımı da farkettiniz eminim...

ALINTIDIR
 
Yukarı Alt