Php ile resim boyutlandırma ve thumbnail oluşturma

Tarih: 30 Mart 2013 Kategori: Php 17 Yorum

php-gdPhp 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.

<?php

/* 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.

<?php

/* 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.

<?php

/*
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;

/* 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.

Şimdilik bu kadar yazıyor ve başka bir yazıda görüşmek üzere diyorum.

17 Yorum

Yorum Yapın
  • Gorkem Cevapla

    Tesekkur ederim yazi için

  • ali Cevapla

    Merhabalar verdiğiniz bilgiler için teşekkürler fakat ben yapamadım.Yüklediğim resimi 1024 x 768 boyutunda kaydetmek istiyorum fakat siyah görüntü kaydediyo yardımcı olursanız sevinirim.Yaparsanız lütfen mail gönderiz.
    Orjinal kaydetme kodum:
    function CreateBigImage($im, $path, $name, $ext, $text, $font, $fontsize, $alpha) {
    @list($width, $height) = getimagesize($im);
    $img = @imagecreatefromjpeg($im);
    $fontsize = $fontsize*2;
    $bbox = @imagettfbbox ($fontsize, 0, $font, $text);
    $col = @imagecolorallocatealpha($img, 255, 255, 255, $alpha);
    @imagettftext($img, $fontsize, 0, $width/2-$bbox[2]/2, $height/2, $col, $font, $text);
    $result = @imagejpeg($img, $path.””.$name.”_”.$ext.”.jpg”, 100);
    if (!$result) {
    return “Hata: Resim oluşturulamadı.. (“.$path.” klasorune yazma hakki verilmemis olabilir)”;
    } else {
    @imagedestroy($img);
    return 1;
    }
    }

    • altayalp Cevapla

      Merhaba resmi boyutlandırmak için yazıda belirttiğim gibi imagecopyresampled() fonksiyonunu kullanmanız gerekli.

  • ali Cevapla

    Çok sağolasın çok iişime yaradı bu konu teşekkürler

  • Gorkem Cevapla

    Teşekkür ederim işime yarayacak

  • vehbi Cevapla

    wamps serverde çalıştı ama sunucuya yükleynce siyah resim oluyor hep sorun nereden kaynaklanıyor olabilir ??

    • altayalp Cevapla

      Sunucunun yapılandırmasından kaynaklı bir sorundur muhtemelen. Sunucudaki hata loglarına bakarsanız hata hakkında fikir edinebilirsiniz.

  • murat Cevapla

    Gerçekten çok faydalı oldu . Bir çok yere bakıp bulamamıştım

  • Ozan Cevapla

    yok ne yaptıysam olmadı,http hatası veriyor

  • Muhammed Cevapla

    Keşke fonksiyonların çalışması için yapılması gerekenlerden de bahsetseydiniz.

    • altayalp Cevapla

      Fonksiyonların çalışması için gd kütüphanesinin yüklü olması yeterli. Yazının başında bunu belirttim.

  • selim Cevapla

    thumbnail oluşturma ile ilgili yazınız için teşekkürler.

  • Aydın Cevapla

    Tüm denilenleri yapmama rağmen bende nedense çalışmadı.
    Anlatım için çok teşekkürler. bir de evde deneyelim bakalım :))

  • barış Cevapla

    bir yerden resimleri çekiyorum ve resimlerin oranları sabit değil. çektiğim resimin yüksekliği 400se küçült değilse orjinal halinde kaydet şeklinde nasıl yapabilirim?

    • altayalp Cevapla

      Merhaba, yazıda konu hakkında detaylı bilgi verdim, yazıyı baştan okumanızı tavsiye ederim. Resmin mevcut boyutlarını almak için getimagesize fonksiyonunu kullanabilirsiniz.

  • barış Cevapla

    sizin verdiğiniz şekilde resmin boyutu atıyorum 10×10 olsa bile belirdiğimiz boyuta yükseltiyor ve buda görüntüyü bozuyor.

  • Ali Arslan Cevapla

    En net şekilde anlatmışsın ELİNE SAĞLIK.:))