Cuando tenemos un blog o una web, hay veces que queremos identificar las imágenes subidas a nuestro sitio añadiendoles el logo de éste. Esto se puede hacer manualmente con cualquier programa de edición de fotografías (Photoshop, GIMP, etc), pero se puede automatizar y es lo que vamos a ver. Hoy, vamos a ver cómo añadir marcas de agua a nuestras imágenes con Laravel y la libreria Intervention Image.
Primero de todo, lo que vamos a hacer va a ser instalar el paquete Intervention Image:
1 |
composer require intervention/image |
Una vez finalice, vamos a añadir el provider y facade al archivo config/app.php:
1 2 3 4 5 6 7 8 9 |
'providers' => [ ... Intervention\Image\ImageServiceProvider::class, ], 'aliases' => [ ... 'Image' => Intervention\Image\Facades\Image::class, ], |
Publicamos el archivo de configuración del paquete, ejecutando el siguiente comando:
1 |
php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5" |
Veremos que se nos generará una archivo en config llamado image.php, ahí podremos indicar el driver que queramos utilizar. Podremos escoger entre «gd» o «imagick». Yo he escogido «imagick».
Ahora vamos a crear el controlador que añadirá la imagen que queramos en la posición que queramos a la imagen subida:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php namespace App\Http\Controllers; use Image; use Illuminate\Http\Request; class WatermarkImageController extends Controller { public function form() { return view('form'); } public function upload(Request $request) { $name = str_random() . '.png'; $image = Image::make($request->image); // indicar la imagen para la marca de agua y la posición $image->insert(public_path('images/logo.png'), 'bottom-right'); $image->save(public_path('images/' . $name)); return redirect()->route('watermark-image-form')->with(['image' => $name]); } } |
He creado dos métodos:
- form: mostrar una vista con el formulario de subida de imágenes.
- upload: generar la imagen nueva con la marca de agua y guardarla. Documentación del método insert.
Creamos la vista con el formulario:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-8"> <form method="post" action="{{ route('watermark-image-upload') }}" enctype="multipart/form-data"> {{ csrf_field() }} <div class="form-group"> <label for="image">Image</label> <input type="file" class="form-control-file" id="image" name="image"> </div> <button type="submit" name="button" class="btn btn-primary">Save</button> </form> @if (session('image')) <hr> <div> <h1>Image Uploaded</h1> <img src="{{ asset('images/' . session('image')) }}" alt=""> </div> @endif </div> </div> </div> @endsection |
Y finalmente creamos las rutas para los métodos anteriores:
1 2 3 |
Route::get('/form', 'WatermarkImageController@form')->name('watermark-image-form'); Route::post('/upload', 'WatermarkImageController@upload')->name('watermark-image-upload'); |
Si accedemos desde el navegador a http://localhost:8080/form, veremos el formulario para subir imágenes. Vamos a probarlo:
Nota: La imagen que he escogido para la prueba es https://unsplash.com/photos/s05XKB6jK2c
Pero con el paquete Intervention Image, también podemos añadir texto. Para ello hay que cambiar el controlador y dejarlo así:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
... public function upload(Request $request) { $name = str_random() . '.png'; $image = Image::make($request->image); $image->text('Texto', $image->width() - 40, $image->height() - 30, function($font) { $font->file(public_path('fonts/montserrat/Montserrat-Regular.ttf')); $font->size(24); $font->color('#f00'); $font->align('center'); $font->valign('top'); }); $image->save(public_path('images/' . $name)); return redirect()->route('watermark-image-form')->with(['image' => $name]); } ... |
La documentación del método text se puede encontrar aquí.
Y el resultado sería: