PHP ile Resim Upload ve Yeniden Boyutlandırma

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">
      </meta></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


      < ?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..
      ?>
      <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="<?php echo $hedefdosya; ?/>" alt="Yükelenen Resim" border="0" />
      </body>
      </html>
      < ?php
      }
      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…



23 Responsesto “PHP ile Resim Upload ve Yeniden Boyutlandırma”

  1. berk diyor ki:

    eline emegine saglık…

  2. yakuter diyor ki:

    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 diyor ki:

    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 diyor ki:

    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 diyor ki:

    “… 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 diyor ki:

    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ı diyor ki:

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

  8. Muhittin Özer diyor ki:

    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 diyor ki:

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

  10. İbrahim Tanrıverdi diyor ki:

    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 diyor ki:

    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 diyor ki:

    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 diyor ki:

    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 diyor ki:

    Ş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 diyor ki:

    @refik: dosya izinlerini kontrol edin.

  16. Muhittin Özer diyor ki:

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

  17. Muhittin Özer diyor ki:

    @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 diyor ki:

    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 diyor ki:

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

  20. Muhittin Özer diyor ki:

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

  21. guest diyor ki:

    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 diyor ki:

    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 diyor ki:

    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…

Leave a Reply