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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
<?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:
1 2 3 4 5 6 7 |
<?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:
1 2 3 4 5 6 7 |
<?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:
1 2 3 4 5 6 7 |
<?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.
1 2 3 4 5 6 7 8 9 |
<?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:
1 2 3 4 5 6 7 8 |
<?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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?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,
Yorumlar
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ı.
Siz kodunuzda
komutunu kullanmışsınız. Bu resmi direk ekrana basar. Bunun için header’la
vs. gibi bilgileri vermelisiniz. Yani bu şekilde çalıştırdığınız PHP dosyası tarayıcıda bir resim gibi davranacaktır.
burası ile formdan resmi yüklüyoruz. Daha sonra işlemleri yaptıktan sonra resmi kaydetmek için
satırını yazıyoruz. Burada resmi kaydetmek istediğimiz dizini bu şekilde ayarlıyoruz.
resim kalitesini aşırı derecede bozuyor nedeni ne olabilir
iyi bir paylaşım mail adresime reklam geldi ordan tıkladım iyi ki gelip okumuşum bu konuyu emeğine sağlık.
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.
Sevgili Oral ÜNAL
Sizi Tebrik Ediyorum Gerçekçen Sadece ve Anlaşılır bir anlatım kulanıyorsunuz.
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.
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.
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.
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?
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