PHP ile Resim Upload ve Yeniden Boyutlandırma

PHP ile resim upload etme ve edilen resmi yeniden boyutlandırma işleminin nasıl yapıldığından bahsetmek istiyorum bu yazımda..

Burada daha çok ortaya hazır bir kod çıkartmaktan ziyade bu işlemin nasıl yapıldığını anlatmak ve okuyanların kendi yorumlarını ekleyerek daha gelişmiş uygulamalarda kullanabilmelerini sağlamak istiyorum..

Yapacağımız işlem bir form aracılığı ile JPEG formatında bir resmi upload etmek ve bunu sabit 300 genişlikte ve yükseklik-genişlik oranını sabit tutarak yeniden boyutlandırmak ve resimler/ klasörümüzde “yeniresim-Dosya Adı” adında oluşturmak.

Öncelikle upload edilecek resmi alacağımız html sayfasını hazırlayalım:

index.html

<html>
	<head>
		<title>;Resim Upload</title>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	</head>
	<body>
		<form name="upload" method="post" action="upload.php" enctype="multipart/form-data">
			<input type="file" name="resim" id="resim" lang="tr" /><br />
			<input type="submit" name="gonder" id="gonder" value="Yükle"/>
		</form>
	</body>
</html>

Şimdi de bu formdan gelen resmi resimler klasörümüze kaydedip boyutunu 300px genişlikte olacak şekilde sabitleyelim:

upload.php

if ($_POST["gonder"] == "Yükle")
{
	$kaynak		= $_FILES["resim"]["tmp_name"]; // Yüklenen dosyanın adı
	$klasor		= "resimler/"; // Hedef klasörümüz
	$yukle		= $klasor.basename($_FILES['resim']['name']);
	if ( move_uploaded_file($kaynak, $yukle) )
	{
		$dosya		= "resimler/" . $_FILES['resim']['name'];
		$resim		= imagecreatefromjpeg($dosya); 	// Yüklenen resimden oluşacak yeni bir JPEG resmi oluşturuyoruz..
		$boyutlar	= getimagesize($dosya); 		// Resmimizin boyutlarını öğreniyoruz
		$resimorani	= 300 / $boyutlar[0]; 			// Resmi küçültme/büyütme oranımızı hesaplıyoruz..
		$yeniyukseklik = $resimorani*$boyutlar[1]; 	// Bulduğumuz orandan yeni yüksekliğimizi hesaplıyoruz..
		$yeniresim	= imagecreatetruecolor("300", $yeniyukseklik); // Oluşturulan boş resmi istediğimiz boyutlara getiriyoruz..
 
		imagecopyresampled($yeniresim, $resim, 0, 0, 0, 0, "300", $yeniyukseklik, $boyutlar[0], $boyutlar[1]);
 
		// Yüklenen resmimizi istediğimiz boyutlara getiriyoruz ve boş resmin üzerine kopyalıyoruz..
		$hedefdosya="resimler/yeniresim-" . $_FILES['resim']['name']; // Yeni resimin kaydedileceği konumu belirtiyoruz..
		imagejpeg($yeniresim, $hedefdosya, 100); 		// Ve resmi istediğimiz konuma kaydediyoruz..
 
		//Kaydettiğimiz yeni resimin yolunu $hedefdosya değişkeni taşımaktadır..
		chmod ($hedefdosya, 0755); // chmod ayarını yapıyoruz dosyamızın..
echo '<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Resim Upload</title>
</head>
<body>
Resminiz başarıyla yüklenmiştir..<br />
<img src="' .$hedefdosya .'" alt="Yükelenen Resim" border="0" />
</body>
</html>';
	}
	else 
		echo "Resim Yüklenemedi";
	// Eğer resim yüklenemediyse move_uploaded_file fonksiyonundan değer false olacağından bu hatayı yazdırırız ekrana
}
else 
	header ("Location: index.html");
?>

Kodlar içerisinde de gerekli açıklamaları yaptım ancak yine de kodlarımızı biraz açıklamakta fayda var sanıyorum..

Öncelikle 2. satırda post değerlerinin dönüp dönemediğine bakıyoruz. Eğer formdan post yoluyla değer almıyorsak index.html dosyamıza yönlendiriyoruz sayfamızı. Ardından formdan gelen tek değer olan resim dosyamızı $kaynak değişkenine atıyoruz. Dosyamızı yükleyeceğimiz klasörün yolunu da $klasor değişkenimize atıyoruz. Ve de $yukle değişkenimizle dosyamızın yeni yerini belirtiyoruz. move_uploaded_file fonksiyonu yüklenen dosyayı 1. parametre olarak alır ve 2. parametresinde de yeni yolunu ister bizden. Bu fonksiyon bir true/false fonksiyondur ve eğer yüklenen dosya istediğimi konuma aktarıldıysa true değerini verir. Burada dosyanın yüklenme işlemi bitmiştir..

Resmimizi boyutlandırma işlemi if bloğumuz içerisinde kalan kısımdadır. $dosya değişkenimize yeniden boyutlandırılacak resmimizin yolunu verdik.  $resim değişkenimize de imagecreatefromjpeg fonksiyonuyla yeni oluşturduğumuz resmimizi atadık. Bu fonksiyon JPEG formatındaki resimlerde kullanılır GIF,PNG formatındaki resimler için imagecreatefromgif, imagecreatefrompng fonksiyonları kullanılabilir. $boyutlar değişkenine getimagesize fonksiyonu ile resim dosyamızın boyutlarını aldık. Bu değişken bir dizi değişkendir ve ilk değeri genişlik ikinci değeri yüksekliktir. Daha sonraki 2 satırda resmin genişliğini 300 olacak şekilde yüksekliğin alması gereken değeri hesaplıyoruz. $yeniresim değişkenimize imagecreatetruecolor fonksiyonu ile istediğimiz yeni boyutlarda bir resim oluşturuyoruz. imagecopyresampled fonksiyonu ile oluşturduğumuz resme yüklediğimiz resmi yeni boyutlarına indirilmiş hali ile kopyalıyoruz. $hedefdosya değişkenine verdiğimiz değer ise oluşturduğumuz yeni resmin yolu. imagejpeg fonksiyonu ise yaptığımız tüm bu işlemlerin sonucunda oluşan resmin çıktısını alıp istediğimiz yolakaydetmemizi sağlar. Burada fonksiyonun 3. parametresi olan 100 resim kalitesidir. Eğer alan sıkıntısı çekiyorsanız kaliteyi düşürebilirsiniz. Ayrıca yine bu fonksyion JPEG formatındaki resimlerde kullanılır. GIF,PNG formatındaki resimler için imagegif, imagepng fonksiyonlarını kullanabilirsiniz. Son olarak bazı sunucular default CHMOD olarak yetersiz izinler atıyor dosyalara. Yazacağımız kodların her ortamda çalışabilmesi için chmod fonksiyonu ile dosya izni ayarlarını da yapıyoruz..

İşlemler bu kadar tabi benim yaptığım balık tutmayı anlatmaya çalışmak.. Sadece bu kodlar sizi tatmin etmiyecektir. Özellikle her formattaki resmi şekillendirecek güvenlik önlemlerini alacak bir script yazmayı size bırakıyorum..

Kolay gelsin…

PHP ile Resim Upload ve Yeniden Boyutlandırma için 34 cevap
  1. berk

    eline emegine saglık…

  2. yakuter

    Yazı güzel, anlatım güzel, örnek güzel. Tek sorun örneğin kodlarının birbirine girmiş olması. Satır aralığı artırılarak veya alınacak vb. tedbirlerle sunuş daha iyi yapılabilir.

    Her şeye rağmen oldukça faydalı bir makale. Ellerine sağlık.

  3. Muhittin Özer

    Teşekkürler.
    Haklısınız biraz öyle oldu, blog yazmaya ilk başladığım zamanlarda yazmıştım bu yazıyı biraz acemlik :)
    Şimdi de çok iyi yazdığım söylenemez ama en azından daha düzenli yazmaya çalışıyorum..

  4. ilhami

    eywallah baya aradım ama bundan daha iyisini bulamadım çok saol iyi oldu. Bide upload ederken sadece jpeg yapıyor bunu dışında gif,png leri nasıl upload edecem yani bir kopyasını nasıl oluşturacam

  5. Muhittin Özer

    “… GIF,PNG formatındaki resimler için imagecreatefromgif, imagecreatefrompng fonksiyonları kullanılabilir. …”

    “… GIF,PNG formatındaki resimler için imagegif, imagepng fonksiyonlarını kullanabilirsiniz. …”

    Yazı içerisinde geçiyor nasıl yapılabileceği.

    Ayrıca http://www.php.net/manual/tr/book.image.php adresinde PHP Manual’de yer alan image fonksiyonlarını bulabilir ve inceleyebilirsiniz.

  6. Burak

    Anlatım İçin Saol kardeş ama bu çalışmadı bende. Hazır Çalışan Dosyaları nasıl alabilirim sizden. Bu konu şuanda çok lazım yardımlarını beklıyorum.

  7. Elmalı

    hocam verdiğin örnek çalışmıyor. hata veriyor…

  8. Muhittin Özer

    Arkadaşlar bu kodların çalışması için sunucu ayarlarının yapılması gerekebilir. Bu ayarlara CHMOD izinlerinden tutun PHP resim işleme fonksiyonlarının çalışmasına izin verilmesine kadar birçok kriter var. En basitinden

    http://tr.php.net/manual/tr/function.imagecreatefromjpeg.php

    adresinden imagecreatefromjpeg() fonksiyonunun çalışması için gereken şartları inceleyebilirsiniz. Bu kodları ben sunucumda çalıştırabiliyorum. Ama her kod her sunucu ayarında çalışmayabilir. Bunun için kodları kopyala/yapıştır mantığıyla kullanmak yerine anlatılanları anlamaya ve kavramaya çalışmak lazım. Bunun için PHP Manual gibi müthiş bir kaynak var.

  9. okan öztürk

    teşekkürler nasıl yardımcı oldunuz bilemezsiniz :)

  10. İbrahim Tanrıverdi

    Gerçekten çok teşekkür ediyorum.

    Ben kitaplardan ve başka sitelerden bu işi yapan kodları bulmuştum ama resmin kalitesini aşırı derecede bozuyordu. Bu kodda öyle bir sıkıntı yok.

    İyi günler, iyi çalışmalar dilerim.

  11. serkan özgür

    cok saol tamda acil gerekiyordu ama resimi yüklüyor ama 8 satırda hata veriyor Call to undefined function: imagecreatefromjpeg() in bu hatayı tekrar teşekkürler yardımcı olursan sevinirim

  12. fatih

    kardeş iyi, güzel, hoşda, birde ben başka bişey istesem bu resimin kopyalanan resimin adresini ve adını veritabanına kopyalanıp veritabanından tekrar nasıl okuturuz yardımcı olurmusun

  13. sercan

    kodları sorunsuz çalıştırdım..Fakat resmin kucuk hali simsiyah cıkıyor sorun nerde olabilir?Baya bi bakındım ama bulamadım..

    kodlar için teşekkurler,iyi çalışmalar

  14. refik

    Şu Hata Benden Mi Kaynaklı Sizce*

    Warning: imagejpeg(): Unable to open ’47.jpg’ for writing: Permission denied in /home/sehitkemal/domains/menemensehitkemal.k12.tr/public_html/panel/yukle.php on line 112 Warning: chmod(): No such file or directory in /home/sehitkemal/domains/menemensehitkemal.k12.tr/public_html/panel/yukle.php on line 117 Warning: getimagesize(47.jpg): failed to open stream: No such file or directory in /home/sehitkemal/domains/menemensehitkemal.k12.tr/public_html/panel/yukle.php on line 120 Warning: imagejpeg(): Unable to open ‘../47.jpg’ for writing: Permission denied in /home/sehitkemal/domains/menemensehitkemal.k12.tr/public_html/panel/yukle.php on line 112 Warning: chmod(): No such file or directory in /home/sehitkemal/domains/menemensehitkemal.k12.tr/public_html/panel/yukle.php on line 117 Warning: getimagesize(../47.jpg): failed to open stream: No such file or directory in /home/sehitkemal/domains/menemensehitkemal.k12.tr/public_html/panel/yukle.php on line 120 Warning: Cannot modify header information – headers already sent by (output started at /home/sehitkemal/domains/menemensehitkemal.k12.tr/public_html/panel/yukle.php:112) in /home/sehitkemal/domains/menemensehitkemal.k12.tr/public_html/panel/yukle.php on line 139

  15. Muhittin Özer

    @refik: dosya izinlerini kontrol edin.

  16. Muhittin Özer

    @sercan: GD kütüphaneleri yüklü olmayaabilir.

  17. Muhittin Özer

    @fatih: Kod ve yazı içinde dosya isimlerinin hangi değişkenlerde atanmış olduğu geçiyor. Veri tabanı işlemleri farklı bir konu burdan ona hiç girmeyelim.

  18. dorem

    gerçekten çok iyi bir örnek ve anlatım, bayadır resim upload olayına kafayı takmıştım… kodların devamını bekleriz.

  19. guest

    sadece jpeg için olması biraz kötü ama süper çalışıo

  20. Muhittin Özer

    @guest: Yazı içerisinde gif ve png için de hangi fonksiyonların kullanıldığı anlatılıyor.

  21. guest

    merhaba kodunuzu png için editledim; ancak hata alıyorum.. aynı kodlama gif ve jpeg de sorun çıkarmaz iken sizce neden png de hata alıyorum, png nin özel bi durumumu var acaba ben çok hakim değilim de bu tür konulara.. en alta aldığım hataları ekliyeceğim

    $resim=imagecreatefrompng($dosya);
    $boyutlar=getimagesize($dosya); // Resmimizin boyutlarını öğreniyoruz
    $resimorani=300/$boyutlar[0]; // Resmi küçültme/büyütme oranımızı hesaplıyoruz..
    $yeniyukseklik=$resimorani*$boyutlar[1]; // Bulduğumuz orandan yeni yüksekliğimizi hesaplıyoruz..
    $yeniresim=imagecreatetruecolor(“300″,$yeniyukseklik); // Oluşturulan boş resmi istediğimiz boyutlara getiriyoruz..
    imagecopyresampled($yeniresim, $resim, 0, 0, 0, 0, “300″, $yeniyukseklik, $boyutlar[0], $boyutlar[1]);
    // Yüklenen resmimizi istediğimiz boyutlara getiriyoruz ve boş resmin üzerine kopyalıyoruz..
    $hedefdosya=”$klasor$file2″.”$kod3″.$_FILES['resim']['name']; // Yeni resimin kaydedileceği konumu belirtiyoruz..
    imagepng($yeniresim,$hedefdosya,100);
    chmod ($hedefdosya, 0755); // chmod ayarını yapıyoruz dosyamızın..

    aldığım hata;
    Warning: imagepng() [function.imagepng]: gd-png: fatal libpng error: zlib failed to initialize compressor — stream error in upload.php on line 72

    Warning: imagepng() [function.imagepng]: gd-png error: setjmp returns error condition in upload.php on line 72

    Warning: imagecreatefrompng() [function.imagecreatefrompng]: gd-png: fatal libpng error: Read Error: truncated data in upload.php on line 75

    Warning: imagecreatefrompng() [function.imagecreatefrompng]: gd-png error: setjmp returns error condition in upload.php on line 75

    Warning: imagecreatefrompng() [function.imagecreatefrompng]: ‘resimler/594865dMercury_Earth_Comparison.png’ is not a valid PNG file in upload.php on line 75

    Warning: imagecopyresampled() expects parameter 2 to be resource, boolean given in upload.php on line 80

    Warning: imagepng() [function.imagepng]: gd-png: fatal libpng error: zlib failed to initialize compressor — stream error in upload.php on line 83

    Warning: imagepng() [function.imagepng]: gd-png error: setjmp returns error condition in upload.php on line 83

  22. guest

    kusura bakmayın size sordum ama çözümü kendim buldum şu satırı değiştirince düzeldi

    imagepng($yeniresim,$hedefdosya,100); // png de sorun yaratıyo

    imagepng($yeniresim,$hedefdosya,9); // sorunsuz çalışabiliyor

  23. berat

    herşey iyi hoşta

    Resim Upload

    Resminiz başarıyla yüklenmiştir..
    <img src="” alt=”Yükelenen Resim” border=”0″ />

    ne tarz bir yanlışlık var kontrol edersin artık biraz daha özenseniz daha iyi olur…

  24. chaizar

    oldukça işime yaradı; çok sağol..

  25. tufan

    fatih arkadaş senin sorun için…

    $kaynak = $_FILES["profilresim"]["tmp_name"];
    $resimname = $_FILES["profilresim"]["name"];
    $rtipi = $_FILES["profilresim"]["type"];
    $rboyut = $_FILES["profilresim"]["size"];

    $ruzanti = substr($resimname, -4);
    $yeniad = substr(uniqid(md5(rand())),0,35);
    $sonSekil = $yeniad.$ruzanti;
    $hedef = “images/user/avatar”;

    $klasor = $kaynak;

    $yukle = $resimname;

    if(move_uploaded_file($kaynak,$yukle)){

    $dosya = $resimname;

    $resim = imagecreatefromjpeg($dosya); // Yüklenen resimden olusacak yeni bir JPEG resmi olusturuyoruz..

    $boyutlar = getimagesize($dosya); // Resmimizin boyutlarini ögreniyoruz

    $resimorani = 300/$boyutlar[0]; // Resmi küçültme/büyütme oranimizi hesapliyoruz..

    $yeniyukseklik = $resimorani*$boyutlar[1]; // Buldugumuz orandan yeni yüksekligimizi hesapliyoruz..

    $yeniresim = imagecreatetruecolor(“300″,$yeniyukseklik); // Olusturulan bos resmi istedigimiz boyutlara getiriyoruz..

    imagecopyresampled($yeniresim, $resim, 0, 0, 0, 0, “300″, $yeniyukseklik, $boyutlar[0], $boyutlar[1]);

    // Yüklenen resmimizi istedigimiz boyutlara getiriyoruz ve bos resmin üzerine kopyaliyoruz..

    $hedefdosya = “$hedef/$sonSekil”;

    imagejpeg($yeniresim,$hedefdosya,100); // Ve resmi istedigimiz konuma kaydediyoruz..

    //Kaydettigimiz yeni resimin yolunu $hedefdosya degiskeni tasimaktadir..

    $updateEdenUye = new dbSorgu;
    $uyeid = $updateEdenUye->oturumAcanUye($oturumAcanUyeID);

    $avatarGuncelle = @mysql_query(“UPDATE “.$photoUpdate->dbprefix.”_uyeler SET avatar=’$sonSekil’ WHERE uyeid=’$uyeid’”);

  26. tufan

    muhittin hocam, elinize sağlık demeyi unuttum :) iyi çalışmalar

  27. [...] dosya izni ayarlarını da yapıyoruz.. Kod betiği ve açıklama metni Muhittin Özer‘in PHP Res... line.web.tr/php-ile-resim-yukleme-ve-yeniden-boyutlandirma.html
  28. emre

    selamlar, upload yapıyor ancak hedef klasöre resmin aynısını da koyuyor bunun olmasını istemiyorum ne yapabilirim?

  29. Muhittin Özer

    @emre:

    unlink($dosyaismi);

    komutuyla istediğiniz dosyayı silebilirsiniz.

  30. yorum

    Güzel paylaşım emeğine sağlık.

  31. Selahattin

    marhaba, hocam anlatım güzel olmuş. ancak takıldığım bir nokta var. yine resmin adını tutan değişkeni bir türlü bulamadım denemediğim şey kalmadı :) ben projemde yüklenen resme benim belirleyeceğim yeni bir ad vermek istiyorum mesela bir sayaç kullanarak filan. sonra iki mesaj yukarıda verdiğin silme komutuyla dosyayı silicem.

    Bunun yanında diğer bir sorun da, kodlar bilgisayarımda çalıştı ama sunucuya gönderdiğimde tam da dediğin gibi “resmi yükleyemedim” cevabını aldım. izinler filan galiba. bu ayarlar için hosting firmasına mı sormam gerekir yoksa benim yapmam gereken ayarlar mıdır bunlar?

  32. Muhittin Özer

    Selahattin Bey,

    Yeni resmin adresi $hedefdosya değişkeninde mevcut, dosya yüklenemediyse hedef klasörün yazma iznini kontrol etmelisiniz. FTP arayüzünden bu izinleri görüntüleyebilir ve düzenleyebilirsiniz.

  33. Selahattin

    Çok çok teşekkürler.
    Resmin adını tutan değişkeni bulmuştum buraya yazdıktan sonra :)
    Bu izin olayı da gerçekten basit bir hataymış hiç aklıma gelmemişti sağ tıklayıp yazma izinlerini vermek :)

    bunların yanında bir sorum daha var :D
    Şimdi;
    Gelen resmin uzantısını str fonksiyonlarıyla tespit edip switch case sorgusu içinde, ona göre imagecratefromXXX() şeklindeki fonksiyonlardan birini kullandım. ve kaydederken de hepsini gif olarak kaydediyorum.
    Burda kaynağı; jpg,png ve gif olan dosyalarda sorun çıkmadı. ama bmp olarak gönderdiğim dosyayı gif olarak kaydederken siyaha boyadı resmi :D

    Buna bir çözüm bulabilir miyim? yoksa siteye bmp uzantılı dosyaları yüklemeyi yasaklayim mi dersiniz?

  34. Muhittin Özer

    BMP uzantılı dosyaların işlenebilirliği hakkında fikrim yok. PHP manual’e bakabilir veya Google’da bir arama yaparak sonuca ulaşabilirsiniz.

Bir Cevap Yazın

E-posta adresiniz yayınlanmayacaktır. Lütfen adınızı, e-posta adresinizi ve yorumunuzu girin.

*

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">