Crie uma miniatura no Laravel usando a biblioteca de imagens de intervenção
No site sempre tratamos das imagens. Com base no requisito, usamos diferentes versões de imagens. É uma boa prática que os desenvolvedores criem versões diferentes, também conhecidas como miniaturas da imagem única. Essas miniaturas podem ser usadas ao exibir diferentes tamanhos de imagens, dependendo do tamanho do contêiner. Mostrar uma imagem que se ajusta ao tamanho do contêiner economiza largura de banda e melhora o tempo de carregamento da página. Mostrar uma imagem de tamanho grande em um contêiner pequeno é uma prática ruim e compromete o tempo de carregamento da página. Como resultado, é recomendável criar várias miniaturas de uma imagem e usar a versão apropriada sempre que necessário.
Neste artigo, estudamos como criar uma miniatura no Laravel usando a biblioteca de Imagens de Intervenção. Intervention Image é gratuito e uma das bibliotecas populares para manipulação de imagens. Em segundo plano, esta biblioteca usa a Biblioteca GD e Imagick para manipulação de imagens.
Para este tutorial, criarei 3 miniaturas – pequeno, médio e grande com tamanhos 150 93, 300 * 185, 550 340 respectivamente. Altere esses tamanhos de acordo com sua necessidade.
Começando
Para começar, você precisa primeiro instalar a biblioteca de Imagens de Intervenção no Laravel. Abra o terminal no diretório raiz do seu projeto e execute o comando abaixo:
composer require intervention/image
Depois de instalar a biblioteca, abra o config/app.php
arquivo e adicione as seguintes linhas nele.
Adicione os provedores de serviço para este pacote na $providers
matriz.
InterventionImageImageServiceProvider::class
Adicione a fachada ao $aliases
array.
'Image' => InterventionImageFacadesImage::class
A seguir, para armazenar as imagens, precisamos criar um diretório. Vá até o terminal e execute o comando da seguinte maneira:
php artisan storage:link
Este comando cria um diretório de armazenamento (link simbólico) na pasta pública. Nesta pasta, irei carregar a imagem original e suas miniaturas.
Crie uma miniatura no Laravel
Todos nós definimos a configuração básica e agora podemos escrever o código real. Vamos criar um formulário em seu arquivo de visualização.
<form action="{{ url('PASS_ACTION_URL') }}" method="post" enctype="multipart/form-data">
<div class="form-group">
<label for="exampleInputFile">File input</label>
<input type="file" name="profile_image" id="exampleInputFile">
</div>
{{ csrf_field() }}
<button type="submit" class="btn btn-default">Submit</button>
</form>
No controlador, você precisa adicionar a fachada da biblioteca ‘Imagem’ que adicionamos no config/app.php
arquivo.
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use Image;
class ImageController extends Controller
{
}
Adicionando a fachada, podemos chamar funções da biblioteca Intervention Image. No código abaixo, irei fazer o upload da imagem em dois lugares. A imagem original vai diretamente para dentro da storage/profile_images
pasta. As miniaturas seriam armazenadas no storage/profile_images/thumbnail
diretório. Primeiro carregamos a imagem original na pasta de miniaturas e depois a redimensionamos.
public function store(Request $request)
{
if($request->hasFile('profile_image')) {
//get filename with extension
$filenamewithextension = $request->file('profile_image')->getClientOriginalName();
//get filename without extension
$filename = pathinfo($filenamewithextension, PATHINFO_FILENAME);
//get file extension
$extension = $request->file('profile_image')->getClientOriginalExtension();
//filename to store
$filenametostore = $filename.'_'.time().'.'.$extension;
//small thumbnail name
$smallthumbnail = $filename.'_small_'.time().'.'.$extension;
//medium thumbnail name
$mediumthumbnail = $filename.'_medium_'.time().'.'.$extension;
//large thumbnail name
$largethumbnail = $filename.'_large_'.time().'.'.$extension;
//Upload File
$request->file('profile_image')->storeAs('public/profile_images', $filenametostore);
$request->file('profile_image')->storeAs('public/profile_images/thumbnail', $smallthumbnail);
$request->file('profile_image')->storeAs('public/profile_images/thumbnail', $mediumthumbnail);
$request->file('profile_image')->storeAs('public/profile_images/thumbnail', $largethumbnail);
//create small thumbnail
$smallthumbnailpath = public_path('storage/profile_images/thumbnail/'.$smallthumbnail);
$this->createThumbnail($smallthumbnailpath, 150, 93);
//create medium thumbnail
$mediumthumbnailpath = public_path('storage/profile_images/thumbnail/'.$mediumthumbnail);
$this->createThumbnail($mediumthumbnailpath, 300, 185);
//create large thumbnail
$largethumbnailpath = public_path('storage/profile_images/thumbnail/'.$largethumbnail);
$this->createThumbnail($largethumbnailpath, 550, 340);
return redirect('image')->with('success', "Image uploaded successfully.");
}
}
No código acima, guardo a imagem com 3 formatos: pequeno, médio e grande. Depois de armazená-los, estamos chamando o método createThumbnail
e passando a largura e altura necessárias para o método. Vamos definir essa função a seguir. Esta função deve ir para o mesmo controlador.
/**
* Create a thumbnail of specified size
*
* @param string $path path of thumbnail
* @param int $width
* @param int $height
*/
public function createThumbnail($path, $width, $height)
{
$img = Image::make($path)->resize($width, $height, function ($constraint) {
$constraint->aspectRatio();
});
$img->save($path);
}
Aqui estamos redimensionando a imagem proporcionalmente. Fazendo isso, mantemos a proporção da imagem e a imagem não é cortada.
Se você está procurando um corte difícil, substitua as linhas abaixo
$img = Image::make($path)->resize($width, $height, function ($constraint) {
$constraint->aspectRatio();
});
$img->save($path);
Com
$img = Image::make($path)->resize($width, $height)->save($path);
Espero que você entenda como criar uma miniatura no Laravel usando a biblioteca de Imagens de Intervenção. Eu gostaria de ouvir sua opinião na seção de comentários abaixo.
Artigos relacionados
- Redimensionar imagem no Laravel usando a biblioteca de imagens de intervenção
- Um guia para fazer upload e compactar imagens no Laravel
- Carregue e redimensione várias imagens no Laravel