Laravel’de imaj boyutlandırma

Web uygulamalarının bütününde, yüklenen imajların çeşitli boyutlarda saklanması bir gereklilik olmuştur. Eski yaklaşımlarda imajlar sunucuya yüklenirken, tasarıma göre, istenen boyutlara dönüştürülüp kaydediliyordu. Imajların değiştirilmesi söz konusu olduğunda, eski imajların temizlenmesi, yerine yenilerinin yerleştirilmesi gibi problemlerin yanında tasarım değiştiğinde eski imajların yeniden boyutlandırılması gibi problemler oluşuyordu. Ancak tahmin ettiğiniz gibi bu eski bir yaklaşım. Yeni yaklaşımlarda ise bir imaj talep edildiğinde, istenen boyuta o anda dönüştürülmekte. Bu durum ilk başta çok yorucu bir işlem gibi eski yaklaşımın bir çok eksikliğini kapatıyor. İşlemini yoruculuğu ise caching yöntemleriyle azaltılabiliyor. Dolayısıyla bu yaklaşımın çok daha iyi olduğunu söyleyebiliriz.

Popüler bir geliştirme ortamı olan Laravel için bu yeni yaklaşımla bir örnek gösterelim. Öncelikle bu yapılan işlemlerin tamamı burada bulunmakta ve kullanacağımız kütüphaneyi buradan inceleyebilirsiniz.

1- Kurulum

Kurulum işlemi composer ile gerçekleştirilebiliyor. Burada kullanacağımız 2 adet paket bulunmakta;

composer require intervention/image
composer require intervention/imagecache

Not: Bu paketlerin doğru çalışması için PHP’nin 5.4 veya daha üstü bir sürümünün yüklü olması ve “FileInfo” isimli eklentinin açık olması gerekiyor. Bununla birlikte imagemagick veya gd kütüphanelerinden en az birinin kurulu olması ve PHP modüllerinin açık olması gerekmekte.

Not: Imagecache kütüphanesi işlediği imajları Illuminate/Cache yardımıyla caching uygulamaktadır. Bu sebeple proje kapsamında kullandığınız (memcached, redis, filesystem vb.) caching yöntemini Imagecache kütüphanesi de kullanacaktır. Dolayısıyla php artisan cache:clear komutuyla cache edilen tüm imajları temizleyebilirsiniz.

2- Laravel Entegrasyonu

Laravel’de bu kütüphaneleri Container’a eklemek için config/app.php ‘de çeşitli düzenlemeler yapmamız gerekiyor. Öncelikle $providers değişkenine aşağıdaki satırı ekliyoruz.

Intervention\Image\ImageServiceProvider::class

Bu işlemden sonra yine aynı dosyada $aliases değişkenine kütüphaneye kolay erişim için takma ad ekliyoruz.

'Image' => Intervention\Image\Facades\Image::class

Gerekli eklemeleri yaptıktan sonra artık kütüphanenin ihtiyaç duyduğu ayarların bulunduğu dosyayı otomatik üretmek için;

php artisan vendor:publish

Komutunu kullanmamız gerekiyor. Bu komuttan sonra config klasorü altında image.php ve imagecache.php isminde iki adet php dosyası oluşacak. Burada image.php içerisinde ilk olarak driver parametresini düzenlememiz gerekli.

'driver' => 'imagick'

Ben imagemagick eklentisini PHP’ye eklediğim için bu seçeneği imagick olarak seçiyorum. Bu kütüphanelerle desteklenen formatları görmek için buradan faydalanabilirsiniz.

Bu işlemden sonra, imagecache.php üzerinde birkaç değişiklik yapmamız gerekli. Öncelikle buradaki route parametresini imajlara ulaşmak için kullanacağımız prefix ve route name için düzenliyoruz. Örnek vermek gerekirse img/test.png isimli bir imaja erişmek için http://domain.com/{route_name}/{template}/img/test.png gibi bir URL’i kullanacağız. Buradaki route parametresi {route_name} için kullanılıyor.

'route' => 'imagecache'

Yukarıdaki gibi bir düzenleme yaptığımızı düşünerek devam edebiliriz. Bu işlemden sonra ‘/imagecache/’ ile başlayan tüm URI’lerde kütüphanemiz devreye girecektir. Ancak burada ikinci önemli kısım, kütüphanenin imajları hangi klasörlerde arayacağının ayarlanmasıdır. Burada ise devreye paths parametresi devreye giriyor.

'paths' => array(public_path())

Bu işlem ile public klasörü altında arama yapabileceğini söylemiş bulunuyoruz. Bu durumda /{proje_klasoru}/public/images/001/test.png yolundaki bir imaja ulaşmak için http://domain.com/imagecache/{template}/images/001/test.png şeklinde bir istekte bulunacağız. Burada path parametresi altında verilen yolları kök klasörmüş gibi kabül edebiliriz.

Son olarak URL üzerindeki {template} kısmını açıklamamız gerekiyor. {template} için varsayılan olarak tanımlanan small, medium, large seçeneklerinin yanında, original, download gibi seçenekler de mevcut. Burada template imaj gönderilirken hangi filtrenin uygulanacağını ifade etmekte. Dolayısıyla proje içerisinde kullanıcı fotoğraflarının 200×200 ‘ boyutunda değilde 150×150 boyutunda kullanılması gerektiğinde, sadece filtrenin yani template parametresinin değiştirilmesi ve gerekli filtrenin hazırlanması yeterli olacaktır.

download parametresi imajın tarayıcıda görüntülenmesi yerine kullanıcının bilgisayarına dosya şeklinde indirilmesini sağlıyor.

Varsayılan olarak gelen filtrelerin boyutlandırmaları şu şekilde;

  • small – 120×90 Pixel
  • medium – 240×180 Pixel
  • large – 480×360 Pixel

Bunların dışında kendi filtrelerimizi oluşturmak için kendi tanımlamamızı yapmalıyız. Örnek olarak kullanıcı imajlarının thumbnail olarak gösterilmesi için bir filtre hazırlayalım.

'thumb' => 'App\Imagecache\Thumb',

Yukarıdaki gibi bir tanımlama yaptıktan sonra app/Imagecache/Thumb.php dosyasını oluşturup şu şekilde düzenliyoruz.

namespace App\Imagecache;


use Intervention\Image\Filters\FilterInterface;
use Intervention\Image\Image;

class Thumb implements FilterInterface
{
    public function applyFilter(Image $image)
    {
        // 200x200 boyutuna dönüştürecek.
        return $image->resize(200, 200);
    }
}

Burada resize etmek dışında imajın canvas büyüklüğünü değiştirebilir, farklı imajlarla birleştirebilir, çeşitli görsel efektler uygulayabilirsiniz. Tüm dökümantasyona buradan ulaşabilirsiniz.