Browse Tag

php

PHP ile Resimlere Fligram Ekleme

Evet arkadaşlar PHP sadece bir kaç if else ve while gibi komutlardan oluşan cılız bir dil değildir. Yapabildikleri bundan çok daha fazladır aslında. Bu dersimizde size sınırlı bilgimle PHP ile resim işleme yöntemlerinden biri olan resimlere nasıl fligram eklenebileceğini göstermeye çalışacağım.

Bu işlemlere başlayabilmek için herşeyden önce sunucunuzda PHP’nin gd kütüphanesinin kurulu ve aktif olması gerekmektedir. Esasında bir çok host varsayılan olarak bu kütüphaneyi sunar. Sisteminizdeki kurulumun gd kütüphanesinin etkinliğini denetlemek için boş bir sayfaya phpinfo(); yazarak sayfayı kaydedin ve sonra tarayıcınızdan sayfayı çağırın. PHP’nin tüm bilgileri ekranda listelenecektir. Burada gd alanını bulun. Benim sistemimdeki görüntü şöyle

phpinfo

Eğer kendi özelliklerinizde gd yok ya da disable olarak görülüyorsa kütüphaneyi yükleyin ve/veya etkinleştirin.

Şimdi gelelim asıl dersimize önce resimlerimize bir bakalım. Şimdi aşağıda üzerine fligram ekleyeceğimiz resimi görüyoruz.

orjinal

Bu resime ekleyeceğimiz fligram da aşağıdaki olsun.

fligram

Şimdi de kodumuzu yazmaya başlayalım. İlk önce orjinal resmimizi ve üzerine eklenecek fligramı ve bunların konumlarını belirtiyoruz.

$fligram = imagecreatefrompng('images/fligram.png');
$resim = imagecreatefromjpeg('images/orjinal.jpg')

Ardından fligramın resim üzerinde duracağı konum için kenar boşluklarını ve konumlandırmak için yine fligramın genişlik ve yükseklik değerlerini alıyoruz.

$marge_right = 10;
$marge_bottom = 10;
$konum_x = imagesx($fligram);
$konum_y = imagesy($fligram);

Şimdi de aşağıdaki gibi fligramın resmin sağ alt köşesinde istediğimiz konumda olmasını sağlayalım.

imagecopy($resim, $fligram, imagesx($resim) - $konum_x - 10, imagesy($resim) - $konum_y - $marge_bottom, 0, 0, imagesx($fligram), imagesy($fligram));

Son olarak da çıktımızı oluşturuyoruz.

header('Content-type: image/png');
imagepng($resim);
imagedestroy($resim);

Bu kodların tamamını php imleri içine aldığımızda aşağıdaki gibi bir sonuç elde ediyoruz.

<?php
$fligram = imagecreatefrompng('images/fligram.png');
$resim = imagecreatefromjpeg('images/orjinal.jpg');

$marge_right = 10;
$marge_bottom = 10;
$konum_x = imagesx($fligram);
$konum_y = imagesy($fligram);

imagecopy($resim, $fligram, imagesx($resim) - $konum_x - 10, imagesy($resim) - $konum_y - $marge_bottom, 0, 0, imagesx($fligram), imagesy($fligram));

header('Content-type: image/png');
imagepng($resim);
imagedestroy($resim);
?>

Sonuçta aşağıdaki resmi elde etmiş olduk.

örnek

Görüldüğü gibi resimimize fligramımızı yerleştirdik. Burada dikkat edilmesi gereken bir nokta var. Kodun 12. satırında header('Content-type: image/png'); ifadesini görüyoruz. Eğer bir PHP kodunda header content kullanılıyorsa onun yukarısında ekrana hiç bir şey yazdırmamalısınız yoksa sayfanızda resim yerine saçma sapan yazılar görürsünüz. Burada ekrana birşey yazdırmamalısınız derken çıktı olarak demek istiyorum yoksa kod kısmında bir sıkıntı yok. Kısaca şöyle özetleyelim header content varsa onun yukarısında print ve echo olmamalı.

Peki bu durumda ne yapacağız. Çok basit zaten content ile çıktımızı png olarak ürettiğimiz için oluşturduğumuz yukardaki kodu ayrı bir sayfa olarak kaydedeceğiz. Mesela ben ornek.php olarak kaydettim. Daha sonra bu php sayfasını tıpkı bir resmi çağırıyormuşuz gibi çağırıyoruz. Yani <img src="ornek.php>yazacağız.

Daha iyi anlaşılması için isterseniz aşağıdaki koda bakalım

<style type="text/css">
<!--
body,td,th {
    color: #FFFFFF;
}
body {
    background-color: #006699;
}
-->
</style>
<p>Deneme sayfası</p>
<p>
  <img src="button.php?">

Bu çok basit sayfadan da görüldüğü gibi ornek.php sayfamızı tıpkı bir resim gibi çağırdık ve sonuç aşağıdaki gibi oldu

son

Bu şekillde gd kütüphanesi kullanarak resmimizin üzerine günün tarihini bile attırabiliriz yani fligram bir resim değil de belirlediğimiz bir yazı da olabilir. Hatta bir döngü ile böyle belli konumdaki dosyaları sıra ile bu işlemden geçirerek birden çok resim üzerinde işlem yapabiliriz. Tabi istersek fligramın konumunu da değiştirebiliriz ancak bunların hepsi birer ayrı bir yazı konusu onun için şimdilik burada noktalıyorum hepinize kolay gelsin.

Nedir Bu Platform Savaşlarından Çektiğimiz?

Her zaman her marka, rakipleri arasından sıyrılarak müşteriler tarafından tercih edilmek ister ki bu da gayet doğaldır ancak bunu yaparken firmaların izleyecekleri yol kendilerini diğerlerinden üstün kılan niteliklerini sıralamak olmalıdır. Diğerlerini Kötülemek değil…

Bugün Microsoft IIS 7.0 / 7.5 tanıtım seminerine katıldım. Sunum yapacak kişi söze ilk önce kendini tanıtarak başladı. İlk önce linux cephesinde yer aldığını ve PHP ile kod yazdığını ama sonra doğru yolu bularak .NET ve Microsoft tarafına geçtiğini söyledi. Haydaaa. Hocam afedersiniz ama sizin doğru yol tanımınız nedir ya da doğru yolda olduğunuza nasıl kanaat getirdiniz.

Sonra yine pHP şöyle kötü ASP .NET şöyle iyi falan… Madem kötü neden 7.5 sürümünden sonra PHP desteği vermeye başlıyorsunuz. Tabi her dilin kendine göre iyi ve kötü yönleri var ama ben oraya sadece IIS”in iyi taraflarını dinlemeye gittim. Yoksa ben hep PHP ile çalışıyorum gayet memnunum. ASP ile çalışan arkadaşlar şaşırıyor nasıl bunun arayüzü yok mu? Veritabanını nasıl bağlıyorsun diye. Eeee bunun arayüzü yok herşeyi elle yazıyorum ama yazdığım koda da tamamen hakim oluyorum.

Çok fazla teknik detaya girmek istemiyorum o yüzden yüzeysel olarak fikrimi söylemek istiyorum. IIS7 gerçekten de çok gelişmiş ve ekleyebileceğiniz modüllerle çoğu işinizi aşırı derecede kolaylaştırabiliyorsunuz. Gerçekten takdir edilecek durum. Üstelik demin de söylediğim gibi artık PHP’ye de destek veriyor.

Ancak bu özelliklerin bazıları Apache üzerinde senelerdir var ve katılımcıların bazıları bunu belirttiler. Yani inceden bir Apache’mi ISS’mi tartışması yaşanmaya başlanmıştı ki hocamız bu duruma izin vermedi iyi de oldu. Apache’nin ISS gibi ki özellikle ISS 7 gibi kolay bir arayüzü yok ama bazı konularda ISS’ten kat kat üstün. Onun için kötülemeyi ve küçümsemeyi bırakalım. Herkes istediği server programını ve platformu tercih etsin. Her yiğidin yoğurt yiyişi farklıdır. Zaten PHP ve ASP özellikle de .NET çok farklı amaçlar için oluşturulmuşlardır. Herkese kendi alanında başarılar.

USB Üzerinde PHP Kurmak

Günümüzde en çok tercih edilen web programlama dillerinden biri olan PHP ile uğraşanlar bilirler… PHP ile ile bir proje oluşturmak için önce bilgisayarınıza bu dili ardından da Apache gibi prjenin üzerinde çalışabileceği bir web server kurmanız gerekir. En sonunda da phpMyAdmin ve MySQL gibi veritabanı yönetim aracı ve bir bir veritabanı… Projenizin içeriğinize göre yüklemeniz gereken uygulamaların sayısı artabilir de… Ancak bunları kurmak ve birbirlerine bağlamk biraz uğraş gerektirir ve bu da birçok kullanıcının bu işe biraz soğuk bakmasına neden olur. Hele hele ilk kez PHP ile ilgili birşeyler yapmak isteyen, bu işe yeni başlayanlar için bu aşama, neredeyse projeyi kodlamaktan daha zor bir hale gelebilir.

Tabi bazı yazılımcılar PHP kurulumundaki bu sıkıntıları ortadan kaldırmak için bazı hazır kurulum paketleri hazırlamaktadırlar. Bunlardan birine örnek olarak EasyPHP örnek olarak verilebilir. Adı geçen bu program tek bir exe dosyasından oluşuyor ve kurulduğunda bütün gerekli PHP bileşenleri bilgisayarınıza zahmetsizce yüklenmiş oluyor.

Bu tip programlar iyi de ya biz çok sık farklı PC de çalışmak zorunda kalıyorsak veya dosyalarımızı sürekli yanımızda taşımak istiyorsak ne yapabiliriz. Kulağa biraz zor gelse de bu da mümkün arkadaşlar. Şimdi XAMPP sayesinde PHP, Apache, Mysql, PhpMyAdmin, Filezilla ve daha bir çok faydalı uygulamayı çok rahat bir şekilde USB flash disklerimizde taşıyabiliyoruz. Artık PHP platformunu hiç bir bilgisayara kurmadan istediğimiz her ortamda flash diklerden çalıştırabiliyoruz. Böylece işte çalıştığımız bir projeyi evde ya da tatillerde de devam ettirebiliyoruz. Şimdi gelelim bunu nasıl yaptığımıza.

XAMPP’ın çeşitli platformlar için sürümleri mevcut ancak ben burada windows versiyonuna göre hareket edeceğim. İlk önce XAMPP’ın web sayfasına gidiyoruz. Sayfada aşağı inerek XAMPP for Windows bağlantısına tıklayarak Windows sürümü için indirme sayfasına ulaşıyoruz. Burada size tavsiyem Basic Package sürümünü indirmeniz. Göreceğiniz gibi installer, ZIP ve EXE (7-zip) olmak üzere üç farklı indirme seçeneği sunulmuş. Ben size EXE (7-zip) olanını tavsiye ederim çünkü en iyi sıkıştırılmış olanı ve en az yer kaplayanı da o… Daha sonra indirdiğimiz dosyayı açıyoruz ve çıkan xampp klasörünü  bilgisayarımızda ya da portatif aygıtımızda kullanıyoruz.

Hangi konumda kullanıyor olursak olalım unutmamamız gereken bir şey var. XAMPP klasörü mtlaka kök dizinde yer almalı. Yani bilgisayarda kullanacaksak C:\xampp; flash diskimizde kullanacaksak F:\xampp gibi konumlarda olmalı. Baştaki C ve F harfleri önemli değil, önemli olan klasörün kök dizinde yer alması örneğin D:\php\xampp gibi başka bir klasörün altına yerleştirirsek program çalışmayacak ve gerekli uygulamalar başlatılamayacaktır.

xampp klasörünün içinde yer alan xampp-control.exe dosyasına tıklıyoruz ve aşağıdaki kontrol panelinin açıldığını görüyoruz.

xampp kontrol paneli

Şimdi iş geldi yerel web sunucumuzu ve veritabanımızı başlatmaya . Yapmamız gereken şey çok basit. Panelde Apache ve MySql yazan alanların sağ taraflarındaki Start yazan butonlara tıklamak.

Apache ve MySQL başlatılıyor

Apache ve MySQL çalışmaya başlayınca aşağıdaki resimde de göreceğiniz gibi panelde uygulamalarla ilgili alanda çalıştıklarına dair mesaj görüntülenecektir.

xampp çalışıyor

Eğer çalıştıramıyorsanız yukarıda söylediğim gibi önce xampp klasörünü diskinizin kök dizinine yerleştirdiğinizden emin olun sonra da xampp-portcheck.exe dosyasını çalıştırarrak port çakışması olup olmadığını kontrol edin.

Bu arada panelde uygulamaların sıralandığı alanda uygulama adlarının hemen solunda Svc yazılı kontrol kutularının olduğunu göreceksiniz. Eğer bunları işaretlerseniz ilgili uygulama işletim sisteminize servis olarak yüklenecektir. Bu takdirde portatif çalışmanın espirisi kaybolacağından ben bu seçeneği işaretlemenizi önermiyorum.

Şimdi sıra geldi uygulamanın çaılışıp çalışmadığını sınamaya. Herhangi bir web tarayaıcısında http://localhost ya da 127.0.0.1 yazıyoruz. İlk defa bunu yaptığımızda karşımıza XAMPP logosu altında dil seçmemizi isteyen bir sayfa gelecek. Türkçe olmadığı için ben İngilizce’yi seçtim. Karşıma aşağıdaki sayfa geldi. Zaten bundan sonrada siz bir değişiklik yapmazsanız hep bu sayfa gelecek.

xampp uygulama sayfası

Bu sayfada örnek uygulamalar, çeşitli araçlar ve işinize yarayacak pek çok faydalı bilgiyi bulabilirsiniz. Eğer bu sayfaya ulaşamadıysanız bir yerlerde yanlış yapmışsınız demektir.

Sizin de geliştireceğiniz projelerin bu portatif sunucu üzerinde çalışabilmesi için dosyalarınızı xampp klasörü içindeki htdocs klasörüne kopyalamanız gerekir. Eğer birden çok proje yapıyorsanız bunları alt klasörlere bölüp çalışmanız daha yararlı olacaktır. Örneğin deneme diye bir projeyi bu klasör altında topladığınızda adres F:\xampp\htdocs\deneme şeklinde olmalıdır. Tarayıcıdan bu projeye erişmek için de http://127.0.0.1/deneme/ ya da http://localhost/deneme/ yazmanız yeterli olacaktır.

Veritabanı ya da diğer uygulamaların ayarları hakkında daha fazla detay için de xampp klasörü içindeki readme_en.txt dosyasına göz atabilirsiniz.

Programı kapatırken de alışık olduğumuz gibi sağ üst köşedeki çarpı işaretinden değil de kontrol paneli üzerindeki Exit yazan butondan kapatın yoksa program kapanmaz sadece görev çubuğuna indirilir.

Şimdilik bende bu kadar hepinize başarılar dilerim.

PHP ile Dosya Uzantılarını Kontrol Etmek

Merhaba arkadaşlar. PHP ve ASP gibi dinamik sayfalar yapabileceğimiz programlama dillerinin çıkması ve giderek gelişmesiyle beraber artık sınırlar yavaş yavaş kalkıyor. Özellikle WEB 2.0 teknolojisi artık web sayfalarının normal programlardan hiç bir farkının kalmamasını sağladı. Bu yazımda da buna örnek olabilecek çok küçük ve çok basit bir konuyu ele almak istiyorum. Gerçekten bu konu yukarıda yazdığım gelişmeler düşünüldüğünde neredeyse sıfır ancak bir zamanlar web sayfalarında bunu bile yapmak bir hayaldi. Geçenlerde yaptığım bir sayfaya eklediğim dosya gönderme bölümünde giden dosyaların türlerini kontrol etmem gerekti. Buna göre kullanıcılar sadece Acrobat, Word ya da Excel boyutunda dosyalar göndrebilecekti. Bunun için dosya uzantılarının ne olduğunu bilmem gerekiyordu. PHP’de basit bir kodla sorunu hallettim ve şimdi de burada sizinle paylaşıyorum. Önce biraz koda bakalım

<?
$dosya_adi="deneme.doc";
$isaret=".";
$pos = strrpos($dosya_adi, $isaret);
$len=strlen($dosya_adi);
$fark=$len-$pos;
$uzanti=substr($dosya_adi,$pos,$fark);
echo $uzanti;
?>

Bu kod dosya adını sondan başlayarak nokta işaretine kadar okuyacaktır. Yani yukarıdaki kodun çıktısı .doc olacaktır. Böylece dosya formatını elde ettikten sonra bunu istediğiniz şekilde kullanabilirsiniz. Örneğin benim yaptığım gibi sadece belirli formatların gönderilmesine izin vermek ya da uzantıya göre sayfanızda o dosyayı açan temek programın simgesini göstermek gibi.

Aslında yukarıdaki örnekte uzantısı alınacak dosya bir değişkenle önceden tanımlanmış (deneme.doc) ve kodumuz bu dosyayı inceledi peki biz böyle tanımlamadan kullanamaz mıyız? Tabi ki kullanırız zaten bir nevi buna zorunluyuz. Ben incelenecek dosyayı bir file yani dosya input alanından öğreniyorum. Formun içine yerleştirilen bu eleman bir adet metin kutusu ve gözat butonundan oluşuyor. Formu gönderirken bu input alanındaki dosya alınıyor. Peki bunu nasıl yapacağız. Aşağıya bir göz atalım.

<?

if ($_POST) {

$dosya_adi=basename( $_FILES['file']['name']);
$isaret=".";
$pos = strrpos($dosya_adi, $isaret);
$len=strlen($dosya_adi);
$fark=$len-$pos;
$uzanti=substr($dosya_adi,$pos,$fark);
echo $uzanti;
}

?>

<form action="" method="post" enctype="multipart/form-data" name="form1">
<input type="file" name="file">
<input type="submit" name="Submit" value="Submit">
</form>

Yukarıdaki örnekte sayfamız ilk önce kendisine gönderilen bir veri yani post varmı diye kontrol ediyor ve yolsa formumuzu gösteriyor. Biz sonra bu form ile bir dosya upload etmek için submit butonuna basınca form bilgileri aynı sayfaya gönderdiği için bir post söz konusu oluyor ve kod işlemeye başlıyor formdan gelen dosyanın gerçek adını alıp bize uzantısını söylüyor.

Dikkat ederseniz daha önce $dosya_adi değişkenini tanımlarken deneme.doc demiştik ama burada aynı değişkeni basename( $_FILES[‘file’][‘name’]); satırına eşitledik ve böylece kod çalıştı. Burada $_FILES ifadesi formdaki dosya upload alanından gelen veriyi işaret eder. file upload etmek için kullandığımız inputun adıdır ve istersek bunu değiştirebiliriz ama o zaman bu değişikliği hem inputtaki name kısmına hem de kodumuzdaki bu $_FILES kısmına ve gerekirse diğer kısımlara da uygulamak gerekecekti. name ise anlayacağınız gibi input ile gelen dosyanın ismini almak için kullanılıyor. Burası için size kullansak mesela o zaman da dosya boyutunu öğrenmek için yazacağımız bir kodla dosya boyutunu öğrenecektik.

Peki bu dosyanın adı config.php.inc olsa ne olacaktı? Sonuç .inc olacakti çünkü kodumuz okumaya sondan başlıyor ver ilk noktaya kadar devam edip orada duruyor. İstesek noktayı da çıkartırız ve sadece doc, inc, jpg gibi sonuçlar elde edebiliriz ama noktanın da kalması bence daha iyi olacaktır.