Php ile resim boyutlandırma ve thumbnail oluşturma



Php ile resmin nasıl küçültülebildiğini ya da boyutunun nasıl değiştirildiğini gösteren birçok kod örneği mevcut, fakat nasıl yapıldığını anlatan Türkçe kaynak bulmak zor. Bu yüzden bu yazıyı yazarken yaptığımız işlemleri yeterince anlatmaya çalıştım.



Php resim işlemleri için birkaç eklentiyi desteklemektedir. Bu yazıda biz PHP 4.3’ten beri PHP paketiyle gelmekte olan GD kütüphanesini kullanacağız. Gd kütüphanesinin aktif olup olmadığını görmek için phpinfo() fonksiyonunu kullanıp GD bölümüne bakabilirsiniz.

Öncelikle kullanacağımız Gd fonksiyonlarını yazalım ve kısaca açıklayalım.

Bazı Php Gd Fonksiyonları

imagecreatetruecolor: Belirtilen boyutta bir resim oluşturur. Resmi yeniden boyutlandırırken bu işlevden dönen kaynağı imagecopyresized fonksiyonuna resim tanıtıcısı olarak geçiririz. İki parametre alır, resmin genişliği ve yüksekliği.
imagecreatefromjpeg: Belirtilen jpg resminden yeni bir resim oluşturur.
imagecreatefrompng: Belirtilen png resminden yeni bir resim oluşturur.
imagecreatefromgif: Belirtilen gif resminden yeni bir resim oluşturur.
imagecopyresampled: Resmi yeniden boyutlandırmak için kullanılır. 10 parametre alır: Hedef resim, kaynak resim, hedef resmin x koordinatı, hedef resmin y koordinatı, kaynak resmin x koordinatı, kaynak resmin y koordinatı, hedef resmin genişliği, hedef resmin yüksekliği, kaynak resmin genişliği ve kaynak resmin yüksekliğidir.
imagecopy: Resmin bir parçasını kopyalar. Resmi yeniden boyutlandırırken “crop” işlemi uygulamak için kullanılır. 8 parametre alır. imagecopyresampled fonksiyonundan farklı olarak kaynak resmin genişliği ve kaynak resmin yüksekli parametrelerini almaz.
imagejpeg: Jpeg resmi tarayıcıya çıktılar ya da dosyaya kaydeder.
imagepng: Png resmi tarayıcıya çıktılar ya da dosyaya kaydeder.
imagegif: Gif resmi tarayıcıya çıktılar ya da dosyaya kaydeder.
imagedestroy: Resim işlemi için ayrılan bellek miktarını serbest bırakır. Bunu mysql_close gibi düşünebilirsiniz.
getimagesize: Bu fonksiyon Gd fonksiyonlarından değildir. Bir resim hakkında bilgi almak için kullanılır. Resmin bilgilerini 7 elemanlı bir dizi olarak döndürür.
[0]=> Resmin genişliği
[1]=> Resmin yüksekliği
[2]=> Resmin türünün sayısal karşılığı. 1 = gif, 2 = jpg, 3 = png
[3]=> Resmin genişliği ve yüksekliği html çıktı olarak verilir. width=”500″ height=”500″ gibi.
[bits]=> Renk bit sayısı.
[channels]=> Resmin CMYK ya da RGB olduğunu belirtir. 3 = RGB, 4 = CMYK
[mime]=> Resmin mime türünü belirtir. image/jpeg gibi
Fonksiyonlarımızı açıkladığımıza göre örneğimize geçebiliriz.

 
/* döküman türünü jpeg olarak ayarlayalım.
bunu resmi tarayıcıda göstermek için kullanıyoruz. */
header('Content-type: image/jpeg');
 
/* işlem yapılacak resim */
$dosya = 'resim.jpg';
 
/* resmi ölçeklemek istediğimiz yükseklik ve genişlik */
$yukseklik = 350;
$genislik = 500;
 
/* küçültmek istediğimiz resmin şu anki boyutları */
list($mevcutGenislik, $mevcutYukseklik) = getimagesize($dosya);
 
/* hedef ve kaynak resimlerini oluşturalım */
$hedef = imagecreatetruecolor($genislik, $yukseklik);
$kaynak = imagecreatefromjpeg($dosya);
 
// Resmi boyutlandıralım
imagecopyresampled($hedef, $kaynak, 0, 0, 0, 0, $genislik, $yukseklik, $mevcutGenislik, $mevcutYukseklik);
 
// Resmi çıktılayalım
imagejpeg($hedef);
 
// ayrılan bellek miktarını temizleyelim
imagedestroy($hedef);
 


Eğer Gd kütüphanesi aktif ise kodları çalıştırdığınızda 500×350 boyutunda bir jpg resmi göreceksiniz. Yukarıdaki kodlarla jpg formatında bir resmi küçülttük. Eğer resmimiz gif veye png formatında olsaydı:

header('Content-type: image/jpeg');

yerine

header('Content-type: image/gif);
veya
header('Content-type: image/png);

imagejpeg
yerine
imagegif
veya
imagepng
Kullanabilirdik.

Küçültülen Resmi Kaydetmek
Resim çıktılayan fonksiyonların aynı zamanda resmi kayıt ettiğini de söylemiştik. Bir resmi dosyaya kaydetmek için header fonksiyonunu kodlarımız arasından çıkartırız ve resmi çıktılayan fonksiyonumuza ikinci parametresini geçiririz.

imagejpeg($hedef, 'yeniresim.jpg');


Jpg Resimlerin Kalitesini Ayarlamak
imagejpeg fonksiyonunun imagegif ve imagepng fonksiyonlarından farklı olarak isteğe bağlı üçüncü parametresi bulunur. Bu parametre resmin kalitesini belirtir. Kalite 0 ile 100 arasında bir sayı olmalıdır. Bu parametreyi resmi tarayıcıda gösterirken de kullanabiliriz. Bunun için resmin adını NULL olarak geçirmemiz gerekir.

// resmi kaydederken kalite belirtmek için
imagejpeg($hedef, 'yeniresim.jpg',100);
 
// resmi tarayıcıda göstermek için
imagejpeg($hedef, NULL, 100);


Kullanılır.

Resmi Orantılı Küçültmek
Resmi orantılı küçültmek için küçük bir matematik hesabı yapabiliriz.

Resmin mevcut genişliği * yeni yükseklik / mevcut yükseklik

Yukarıdaki işlem sonucu resmin oranını bozmadan yeni genişliğimizi elde ederiz. Aşağıdaki kod resmi orantılı olarak küçültür ve yeni isim vererek kaydeder.
 
/* işlem yapılacak resim */
$dosya = 'resim.jpg';
 
/* küçültmek istediğimiz resmin şu anki boyutları */
list($mevcutGenislik, $mevcutYukseklik) = getimagesize($dosya);
 
/* resmi ölçeklemek istediğimiz yükseklik ve genişlik */
$yukseklik = 350;
 
/* resmin yeni genişliği buluyoruz */
$genislik = round(($mevcutGenislik * $yukseklik) / $mevcutYukseklik);
 
/* hedef ve kaynak resimlerini oluşturalım */
$hedef = imagecreatetruecolor($genislik, $yukseklik);
$kaynak = imagecreatefromjpeg($dosya);
 
// Resmi boyutlandıralım
imagecopyresampled($hedef, $kaynak, 0, 0, 0, 0, $genislik, $yukseklik, $mevcutGenislik, $mevcutYukseklik);
 
// Resmi çıktılayalım
imagejpeg($hedef, 'yeni_' . $dosya, 100);
 
// ayrılan bellek miktarını temizleyelim
imagedestroy($hedef);
 

Resim Kırpma İşlemi
Php ile resim kırpma (crop) işlemi, photoshop gibi resim düzenleme programlarıyla yapılan kırpma işleminin aynısıdır. Resim küçültülmez, sadece belirli bir kısmı kalır, diğer kısımlar atılır. Bu işlem için yukarıda açıkladığımız imagecopy fonksiyonunu kullanacağız.

 
/*
döküman türünü jpeg olarak ayarlayalım.
bunu resmi tarayıcıda göstermek için kullanıyoruz.
*/
header('Content-type: image/jpeg');
 
/* işlem yapılacak resim */
$dosya = 'resim.jpg';
 
/* resmi ölçeklemek istediğimiz yükseklik ve genişlik */
$yukseklik = 350;
$genislik = 500;
 
/* küçültmek istediğimiz resmin şu anki boyutları */
list($mevcutGenislik, $mevcutYukseklik) = getimagesize($dosya);
 
/* hedef ve kaynak resimlerini oluşturalım */
$hedef = imagecreatetruecolor($genislik, $yukseklik);
$kaynak = imagecreatefromjpeg($dosya);
 
/*
Resmi boyutlandıralım
Resmi ortalamak için kaynak resmin x ve y koordinatlarıyla oynayabilirsiniz
örnek: imagecopy($hedef, $kaynak, 0, 0, 100, 100, $genislik, $yukseklik);
*/
imagecopy($hedef, $kaynak, 0, 0, 0, 0, $genislik, $yukseklik);
 
// Resmi çıktılayalım
imagejpeg($hedef, NULL, 100);
 
// ayrılan bellek miktarını temizleyelim
imagedestroy($hedef);
 

Kodu çalıştırdığınızda resmin küçültülmediğini sadece resmin bir kısmının gösterildiğini görürsünüz. Kodların arasında açıkladığım gibi, eğer resmin farklı yerlerini kırpmak isterseniz kaynak resmin x ve y koordinatlarıyla oynayabilirsiniz.

Hiç yorum yok:

Yorum Gönder

 

Sample Text

Sample Text