php

PHP ile Resmi Yeniden Boyutlandırma

Merhaba,

Bu makaledeki kodlar benim kendi eserim değildir. Bir blogda gördüm ve sizlerle paylaşmaya karar verdim.

Bölüm 1 – Bu Sınıf Ne İşe Yarıyor

SimpleImage isimli bu sınıf yolunu belirttiğiniz resimlerin genişliklerini ve yüksekliklerini düzenlemenizi sağlıyor. Bu sınıf sayesinde resimlerinizi %’li değer girerek ölçekleyebilir, genişlik ve yüksekliğini manuel belirleyebilir veya sadece genişlik/yükseklik değerlerinden birini girerek oranları bozmadan yeniden boyutlandırabilirsiniz.

Boyutlandırma işlemlerini en basit yapabileceğini sınıflardan birisi bence bu.

Bölüm 2 – Sınıf Kodları

Bu sınıfın kodları aşağıdaki gibidir:

<?php

/*
* File: SimpleImage.php
* Author: Simon Jarvis
*/

class SimpleImage {

   var $image;
   var $image_type;

   function load($filename) {

      $image_info = getimagesize($filename);
      $this->image_type = $image_info[2];
      if( $this->image_type == IMAGETYPE_JPEG ) {

         $this->image = imagecreatefromjpeg($filename);
      } elseif( $this->image_type == IMAGETYPE_GIF ) {

         $this->image = imagecreatefromgif($filename);
      } elseif( $this->image_type == IMAGETYPE_PNG ) {

         $this->image = imagecreatefrompng($filename);
      }
   }
   function save($filename, $image_type=IMAGETYPE_JPEG, $compression=75, $permissions=null) {

      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image,$filename,$compression);
      } elseif( $image_type == IMAGETYPE_GIF ) {

         imagegif($this->image,$filename);
      } elseif( $image_type == IMAGETYPE_PNG ) {

         imagepng($this->image,$filename);
      }
      if( $permissions != null) {

         chmod($filename,$permissions);
      }
   }
   function output($image_type=IMAGETYPE_JPEG) {

      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image);
      } elseif( $image_type == IMAGETYPE_GIF ) {

         imagegif($this->image);
      } elseif( $image_type == IMAGETYPE_PNG ) {

         imagepng($this->image);
      }
   }
   function getWidth() {

      return imagesx($this->image);
   }
   function getHeight() {

      return imagesy($this->image);
   }
   function resizeToHeight($height) {

      $ratio = $height / $this->getHeight();
      $width = $this->getWidth() * $ratio;
      $this->resize($width,$height);
   }

   function resizeToWidth($width) {
      $ratio = $width / $this->getWidth();
      $height = $this->getheight() * $ratio;
      $this->resize($width,$height);
   }

   function scale($scale) {
      $width = $this->getWidth() * $scale/100;
      $height = $this->getheight() * $scale/100;
      $this->resize($width,$height);
   }

   function resize($width,$height) {
      $new_image = imagecreatetruecolor($width, $height);
      imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
      $this->image = $new_image;
   }

}
?>

Bölüm 3 – Sınıfın Kullanımı

Yukarıdaki sınıfı SimpleImage.php adlı bir dosyaya kaydedin.

Örnek 1 – GenişlikxYükseklik ayarlama ve farklı isimle kaydetme

Şimdi picture.jpg adlı resim dosyamızı 250×400 ebatlarında tekrar boyutlandıralım ve picture2.jpg ismiyle kaydedelim:

<?php
   include('SimpleImage.php');
   $image = new SimpleImage();
   $image->load('picture.jpg');
   $image->resize(250,400);
   $image->save('picture2.jpg');
?>

Örnek 2 – Oranları koruyarak sadece genişliği değiştirip farklı bir isimle kaydetme

Şimdi picture.jpg dosyamızı 250 piksel genişliğinde oranları koruyarak resmi yeniden boyutlandıralım ve picture2.jpg olarak kaydedelim:

<?php
   include('SimpleImage.php');
   $image = new SimpleImage();
   $image->load('picture.jpg');
   $image->resizeToWidth(250);
   $image->save('picture2.jpg');
?>

Örnek 3 – Resmi belirli bir yüzde oranında küçültme

Şimdi picture.jpg dosyamızı %50 oranında küçültelim ve picture2.jpg ismiyle kaydedelim:

<?php
   include('SimpleImage.php');
   $image = new SimpleImage();
   $image->load('picture.jpg');
   $image->scale(50);
   $image->save('picture2.jpg');
?>

Örnek 4 – Resmi farklı yüksekliklerde farklı isimlerle kaydetme

Şimdi picture.jpg dosyasının yüksekliğini 500px olarak ayarlayalım ve picture2.jpg olarak kaydedelim aynı anda yüksekliği 200px olarak da picture3.jpg olarak kaydedelim.

<?php
   include('SimpleImage.php');
   $image = new SimpleImage();
   $image->load('picture.jpg');
   $image->resizeToHeight(500);
   $image->save('picture2.jpg');
   $image->resizeToHeight(200);
   $image->save('picture3.jpg');
?>

Örnek 5 – Resmi kaydetmeden ekrana küçük resmini çıkartma

Şimdi picture.jpg dosyamızı yeni bir dosya olarak kaydetmeden nasıl küçük resim olarak gösterebileceğimize bakalım:

<?php
   header('Content-Type: image/jpeg');
   include('SimpleImage.php');
   $image = new SimpleImage();
   $image->load('picture.jpg');
   $image->resizeToWidth(150);
   $image->output();
?>

Örnek 6 – Form uygulaması

Şimdi formdan yüklediğimiz resmi 150 piksel genişliğinde yeniden boyutlandırıp ekrana basalım:

<?php
   if( isset($_POST['yukle']) ) {
      header('Content-Type: image/jpeg');
      include('SimpleImage.php');
      $image = new SimpleImage();
      $image->load($_FILES['resim']['tmp_name']);
      $image->resizeToWidth(150);
      $image->output();
   } else {
?>
   <form action="resim_yukle.php" method="post" enctype="multipart/form-data">

      <input type="file" name="resim" />

      <input type="submit" name="yukle" value="Yükle" />

   </form>
<?php
   }
?>

Sonuç

Bu sınıfla ilgili sorularınızı forumda başlık açarak veya burada yorum yaparak sorabilirsiniz. Resimleri yeniden boyutlandırmak için harika bir sınıf.

Kolay gelsin,

Post Author: Oral ÜNAL

Web geliştirmeyi başta meslek olarak hayal eden fakat daha sonra bir hobi haline getiren birisiyim işte.

PHP ile Resmi Yeniden Boyutlandırma” için 10 yorum

  • abaki

    (19 Haziran 2012 - 01:37)

    Merhabalar
    Denedim ama işlem yapmadı.
    Tarif ettiğiniz gibi SimpleImage sayfasını hazırladım. Ekle butonumuzun çalıştığı kısma şu şekilde yazdım:
    ———————-
    $image = new SimpleImage();
    $image->load($_FILES[‘Resim’][‘tmp_name’]);
    $image->save($_FILES[‘Resim’][‘tmp_name’]);
    $image->output();
    ——————–
    Ama olmadı.Çıktı olarak ekrana ����JFIF��>CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality ��C diye devam eden yazılar geldi.

    Bu anlatımda seçilen ve boyutu değiştirilen resmin nereye kaydedildiğini anlayamadım.
    Eğer elinizde çalışır hali ise, seçilen resmin, belirlenen klasör içerisine kopyalandığı örneği paylaşabilir misiniz? Örneğin: Kullanıcının seçtiği resmi, Resimler/Haberler klasörü altına yeni boyutuyla aktarılması.

  • Oral ÜNAL

    (19 Haziran 2012 - 06:13)

    Siz kodunuzda

    $image->output();

    komutunu kullanmışsınız. Bu resmi direk ekrana basar. Bunun için header’la

    header('Content-Type: image/jpeg');
    header('Content-Type: image/gif');

    vs. gibi bilgileri vermelisiniz. Yani bu şekilde çalıştırdığınız PHP dosyası tarayıcıda bir resim gibi davranacaktır.

    $image->load($_FILES['Resim']['tmp_name']);

    burası ile formdan resmi yüklüyoruz. Daha sonra işlemleri yaptıktan sonra resmi kaydetmek için

    $image->save('resmi_kaydedeceginiz_dizin_adi/' . $_FILES['Resim']['tmp_name']);

    satırını yazıyoruz. Burada resmi kaydetmek istediğimiz dizini bu şekilde ayarlıyoruz.

  • ahmet

    (20 Temmuz 2012 - 14:40)

    resim kalitesini aşırı derecede bozuyor nedeni ne olabilir

  • serdar sezen

    (18 Ekim 2012 - 01:32)

    iyi bir paylaşım mail adresime reklam geldi ordan tıkladım iyi ki gelip okumuşum bu konuyu emeğine sağlık.

  • Mehmet

    (18 Ekim 2012 - 12:12)

    Sevgili Oral ÜNAL

    sınıfın çalışır halde olan php dosyalarını zipleyip koysaydın yazının altına ne güzel olurdu. Hadi madem olmamış bari bana e-posta ile göndersende güzel olur.

    paylaşımın için teşekkür ederim.

  • Abdullah

    (24 Aralık 2012 - 13:55)

    Sevgili Oral ÜNAL

    Sizi Tebrik Ediyorum Gerçekçen Sadece ve Anlaşılır bir anlatım kulanıyorsunuz.

  • halil

    (15 Ocak 2013 - 00:11)

    hocam öncelikle konu için teşekkürler gayet başarılı ve yararlı bir paylaşım olmuş.

    şöyle bir sorum olacaktı size resim boyutlarını ayarlarken dik olan resimler bozuluyor resimleri *gösterdiğim bir div çerçevem var boyutları 477×300 şeklinde. dik resimlerin genişliği bozulmasın vede çerceveden dışarı taşmasın diye $image->resizeToHeight(300); kodu ile yüksekliğini ayarladım resmide ortaladım. çerceve içerisinde sorunsuz düzgün olarak görüntüleyebildim. Fakat genişliği büyük resimlerde taşmalar oldu haliyle. bende if komutu ile getimagesize denedim beceremedim. en son aşağıdaki gibi denedim bu şekildede sadece resmin boyutunu 300 yapıyo.

    	$img=$image-&gt;save($dizin3);
    			
    			if($img &gt;= 477){
    			$image-&gt;resize(477,300);
    			$image-&gt;save($dizin3);
    			}else{
    			$image-&gt;resizeToHeight(300);
    			$image-&gt;save($dizin3);
    			};
    

    Genişliği 477 den büyük olanları bu şekilde $image->resize(477,300); ufak olanlarıda $image->resizeToHeight(300); bu şekilde nasıl kaydettirebilirim? cevabınızı bekliyorum iyi çalışmalar.

  • Erkin Tanyeli

    (24 Şubat 2013 - 03:25)

    Paylaşım çok iyi teşekkürler gayet detaylı bir şekilde anlatmışsınız. Bende kendi sitemde kullanmak için bikaç şey ekledim sizinlede paylaşmak istedim :
    load($_FILES[‘resim’][‘tmp_name’]);
    $yol = $_FILES[‘resim’][‘name’];
    $parca = “.”;
    $resim_uzanti = explode($parca,$yol);
    $dosya_yeni_ad = substr(uniqid(md5(rand())), 0,20); // random md5 atıyor resme.
    $dosya_ad = $dosya_yeni_ad.”.”.$resim_uzanti[1];
    $image->resizeToWidth(150);
    $image->save(‘images/kucuk_resim/’.$dosya_ad);
    $image->resizeToWidth(350);
    $image->save(‘images/buyuk_resim/’.$dosya_ad);
    } else {
    ?>

    veritabanına kaydederken $dosya_ad ı kullanabilirsiniz.

  • Mehmet ÇELİK

    (26 Şubat 2016 - 12:10)

    Yüksek boyutlu fotoğraflarda (8MB gibi) yüklemelerde çok vakit kaybettiriyor, bazen zaman aşımı oluşuyor. Hızlı olması açısından komut sıralaması değiştirmenin bir faydası olur mu? Load edilen fotoğrafı, bu komutu gerçekleştirmeden kırpmanın ve sonra load etmenin ve save etmenin mantığı saçma mıdır?

  • Bahadır

    (01 Nisan 2016 - 18:33)

    güzel bir çalışma olmuş teşekkürler fakat benim bir sıkıntım var.

    düşük kb da resim yüklendiğim zaman güzel şekilde işlem gerçekleşiyor fakat 2 3 mb yada daha kaliteli resimlerde sıkıntı yaşıyorum. Bunu nasıl çözebilirim

Yorum yazma sırası sizde!