Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Image Laravel Laravel Package

intervention/image-laravel

Laravel integration for Intervention Image. Provides a service provider, facade, and publishable config (config/image.php) to set a global GD/Imagick driver and options. Install via Composer and configure once for consistent image processing across your app.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Steps

  1. Installation:

    composer require intervention/image-laravel
    
  2. Publish Configuration (optional but recommended for customization):

    php artisan vendor:publish --provider="Intervention\Image\Laravel\ServiceProvider"
    

    This generates config/image.php with default settings (GD driver, auto-orientation, etc.).

  3. First Use Case: Process an uploaded image in a route:

    use Intervention\Image\Laravel\Facades\Image;
    
    Route::post('/upload', function (Request $request) {
        $image = Image::make($request->file('image'))
            ->resize(800, 600)
            ->save(public_path('processed.jpg'));
    });
    

Where to Look First

  • Facade: Intervention\Image\Laravel\Facades\Image (central entry point).
  • Configuration: config/image.php (driver, options like autoOrientation).
  • Response Macro: response()->image($image, Format::WEBP) for HTTP responses.

Implementation Patterns

Core Workflows

  1. Upload & Process:

    $image = Image::make($request->file('image'))
        ->fit(300, 300) // Maintain aspect ratio
        ->encode('jpg', 80); // Save with quality
    
  2. Dynamic Thumbnails:

    $thumbs = collect([200, 400, 800])->map(fn($size) =>
        Image::make($original)
            ->resize($size, null, function ($constraint) {
                $constraint->aspectRatio();
            })
            ->toBase64()
    );
    
  3. Format Conversion:

    $webp = Image::make($original)
        ->encode('webp', 75);
    
  4. Storage Integration:

    Storage::put('optimized/' . $filename, $image->encode());
    

Integration Tips

  • Laravel Filesystem: Use Storage::disk('s3')->put() for cloud storage.
  • Jobs: Offload processing to queues:
    ProcessImageJob::dispatch($imagePath, $resizeTo);
    
  • Validation: Combine with Laravel’s validation:
    $request->validate(['image' => 'required|image|mimes:jpeg,png']);
    
  • Caching: Cache processed images by path + dimensions:
    Cache::remember("image_{$path}_{$width}x{$height}", now()->addHours(1), fn() =>
        Image::make($path)->resize($width, $height)->encode()
    );
    

Advanced Patterns

  • Custom Drivers: Extend Intervention\Image\Drivers\DriverInterface for specialized needs (e.g., GPU acceleration).
  • Middleware: Add image processing to middleware for global transformations:
    public function handle(Request $request, Closure $next) {
        if ($request->hasFile('image')) {
            $request->merge(['image' => Image::make($request->file('image'))->resize(1024, 768)]);
        }
        return $next($request);
    }
    
  • API Responses: Use the response()->image() macro for optimized delivery:
    return response()->image($image, Format::WEBP, quality: 60)
        ->header('Content-Disposition', 'inline; filename="optimized.jpg"');
    

Gotchas and Tips

Pitfalls

  1. Driver Conflicts:

    • GD vs. Imagick: Ensure your PHP installation has the correct extension (php-gd or php-imagick). Test with:
      php artisan config:clear && php -m | grep -E 'gd|imagick'
      
    • Fallback: Configure a fallback driver in config/image.php if primary fails.
  2. Memory Limits:

    • Large images may hit PHP’s memory_limit. Increase temporarily:
      ini_set('memory_limit', '512M');
      
    • Use ->resize() before ->encode() to reduce memory usage.
  3. Console Context:

    • The response()->image() macro is disabled in Artisan commands (see #18). Use ->encode() directly instead.
  4. File Extensions:

    • Always use ->encodeUsingFileExtension() or specify formats explicitly to avoid silent failures:
      $image->encode('jpg'); // Explicit
      $image->encodeUsingFileExtension('png'); // From filename
      
  5. Exif Data:

    • autoOrientation may rotate images unexpectedly. Disable if needed:
      config(['image.options.autoOrientation' => false]);
      

Debugging Tips

  • Log Errors: Wrap operations in try-catch:
    try {
        $image->resize(1000, 1000);
    } catch (\Intervention\Image\Exception\NotWritableException $e) {
        Log::error('Image write failed: ' . $e->getMessage());
    }
    
  • Validate Inputs: Check file types before processing:
    if (!$request->file('image')->isValidImage()) {
        throw new \Exception('Invalid image file');
    }
    
  • Test Drivers: Verify driver functionality:
    $driver = app(\Intervention\Image\ImageManager::class)->driver();
    Log::info('Using driver:', [$driver::class]);
    

Extension Points

  1. Custom Image Classes: Extend Intervention\Image\Image for domain-specific methods:

    class ProductImage extends \Intervention\Image\Image {
        public function addWatermark($watermarkPath) {
            $this->insert($watermarkPath, 'center');
        }
    }
    

    Register via service provider:

    $manager->extend('product', function () {
        return new ProductImage();
    });
    
  2. Event Listeners: Trigger events for processed images:

    event(new ImageProcessed($imagePath, $newDimensions));
    
  3. Testing: Mock the facade in tests:

    Image::shouldReceive('make')
        ->once()
        ->andReturn($mockImage);
    

Configuration Quirks

  • Environment Overrides: Use .env to override driver:
    IMAGE_DRIVER=Intervention\Image\Drivers\Imagick\Driver::class
    
  • Quality Defaults: Set global quality in config/image.php:
    'options' => [
        'quality' => 80, // Default for encode()
    ]
    
  • Animation Handling: Disable decodeAnimation for static images to save memory:
    'options' => [
        'decodeAnimation' => false,
    ]
    

Performance Optimizations

  • Lazy Loading: Use ->stream() for large files:
    return response()->stream(function () use ($image) {
        echo $image->stream('jpg', 70);
    });
    
  • Batch Processing: Process multiple images in a loop with error handling:
    foreach ($files as $file) {
        try {
            $image = Image::make($file)->resize(500, 500);
            $image->save(storage_path("processed/{$file->hashName()}"));
        } catch (\Exception $e) {
            Log::error("Failed to process {$file->getClientOriginalName()}: {$e->getMessage()}");
        }
    }
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
hamzi/corewatch
minionfactory/raw-hydrator
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours
renatovdemoura/blade-elements-ui
devgeek/beacon-admin
benjamin-rqt/data-watcher-bundle
atriumphp/atrium
sandermuller/package-boost-laravel
sandermuller/boost-skills
redaxo/core
yusufgenc/filament-api-forge
l3aro/rating-star-for-filament
leek/filament-subtenant-scope