Skip to Content

jessyledama/kompressor

A lightweight image compression library built with Laravel

A lightweight image compression library built with Laravel

Kompressor is a Laravel-ready package that compresses uploaded images using Intervention Image and Spatie Image Optimizer, with automatic fallback between imagick and gd.

It provides an easy, fluent API:

$compressed = Kompressor::compress($request->file('image'));

Features

  • Automatic driver selection (imagick → gd)
  • Compress images to a target max size (KB)
  • Optimizes using external binaries when available
  • Stores original + compressed versions
  • Laravel Storage-ready
  • Zero configuration required (auto-publishes config)


Installation

Install via Composer

composer require jessyledama/kompressor

Dependencies

Kompressor depends on these packages:

Laravel packages (installed automatically)

Package Purpose
intervention/image Image manipulation (GD/Imagick)
spatie/image-optimizer Lossless optimization

If they are not installed automatically, run:

composer require intervention/image spatie/image-optimizer


System Dependencies

Spatie/ImageOptimizer uses external binaries (optional but highly recommended) for best compression speed & quality.

Ubuntu / Debian

sudo apt install jpegoptim optipng pngquant gifsicle webp

CentOS / AlmaLinux

sudo yum install epel-release
sudo yum install jpegoptim optipng pngquant gifsicle libwebp-tools

macOS (Homebrew)

brew install jpegoptim optipng pngquant gifsicle webp


Publish Config (optional)

If you want to customize the directories or max allowed size:

php artisan vendor:publish --tag=kompressor-config

This creates:

config/kompressor.php


Example:

return [
    'original_path'   => 'original-images',
    'compressed_path' => 'compressed-images',
    'max_kb'          => 300, // target size in KB
];


Usage

Basic Example (Controller)

use Kompressor;
use Illuminate\Http\Request;

public function store(Request $request)
{
    $validated = $request->validate([
        'image' => ['required', 'mimes:jpg,jpeg,png,gif'],
    ]);

    $compressed = Kompressor::compress($request->file('image'));

    // Example return:
    // [
    //     "original" => "original-images/abc123.jpg",
    //     "compressed" => "compressed-images/compressed_abc123.jpg",
    //     "final_size_kb" => 152,
    //     "driver_used" => "imagick"
    // ]

    $path = $compressed['compressed'];

    // Save to DB, etc...
}


Returned Data Structure

Kompressor returns an array:

[
    'original'       => 'original-images/filename.jpg',
    'compressed'     => 'compressed-images/compressed_filename.jpg',
    'final_size_kb'  => 120.45,
    'driver_used'    => 'imagick'
]


Using in Blade

<img src="{{ asset('storage/' . $compressed['compressed']) }}">


Custom Max Size

Edit config/kompressor.php:

'max_kb' => 200,


Driver Fallback Logic

Kompressor checks in order:

State Action
imagick installed Uses Imagick (fastest & cleanest)
imagick missing Logs warning + uses GD

Development Instructions

Clone the repo:

git clone https://github.com/jessyledama/kompressor.git


Install dependencies:

composer install


License

This package is open-source software licensed under the MIT License.

Contributions

Pull requests and issues are welcome on the Github repo!