Redimensionar imagem no Laravel usando a biblioteca de imagens de intervenção
Recentemente, um de nossos leitores perguntou como redimensionar a imagem no Laravel. O redimensionamento de imagens é uma tarefa normal para desenvolvedores. Os desenvolvedores devem fazer isso corretamente. É uma boa prática redimensionar as imagens de acordo com o tamanho do contêiner. Isso ajuda você a melhorar a velocidade da página. Neste artigo, estudamos como redimensionar a imagem no Laravel usando a biblioteca Intervention Image.
A biblioteca de imagens de intervenção fornece uma maneira fácil de redimensionar as imagens. Esta biblioteca usa GD Library e Imagick para manipulação de imagens por baixo do capô.
Por que redimensionar imagens?
Veja o exemplo de uma galeria. Ao trabalhar em uma galeria, normalmente exibimos a pequena miniatura na lista. Quando alguém clica na miniatura, mostramos uma imagem original. Aqui, as miniaturas são a versão redimensionada da imagem original.
Digamos que o tamanho da imagem original seja 500 500 e o contêiner de miniaturas 200 200. Nesse caso, você deve redimensionar a imagem original de acordo com o tamanho do contêiner da miniatura. Usar uma imagem de tamanho grande em um contêiner pequeno é uma prática ruim. Isso afeta o desempenho do site.
Este é um exemplo de por que devemos redimensionar as imagens. Há muitos outros também. Dito isso, vamos dar uma olhada em como redimensionar a imagem no Laravel usando a biblioteca de Imagens de Intervenção.
Instalação
Para começar, você precisa instalar a biblioteca Intervention Image em seu projeto Laravel. Você deve ter o Composer instalado em seu sistema. 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 o provedor de serviços deste pacote ao $providers
array.
InterventionImageImageServiceProvider::class
Em seguida, adicione a fachada ao $aliases
array.
'Image' => InterventionImageFacadesImage::class
Redimensionar imagem no Laravel
Para redimensionar a imagem, primeiro temos que escrever o código para fazer o upload de uma imagem. Portanto, primeiro crie um diretório onde armazenaremos as imagens. Vá até o terminal e execute o comando:
php artisan storage:link
Este comando cria um diretório de ‘armazenamento’ na pasta ‘pública’. Na pasta ‘armazenamento’, iremos armazenar uma versão completa e uma versão em miniatura das imagens.
Em seguida, crie um formulário em seu arquivo de visualização. Também estou adicionando código para a mensagem de sucesso no arquivo blade.
@if (session('success'))
<div class="alert alert-success">
{{ session('success') }}
</div>
@endif
<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>
Substitua o marcador ‘PASS_ACTION_URL’ por sua rota.
No controlador, é necessário adicionar a fachada ‘Imagem’ de uma biblioteca 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. Uma é a imagem original na pasta ‘profile_images’. O segundo está no diretório ‘profile_images / thumbnail’. Vou primeiro fazer upload da imagem original na pasta de miniaturas e, em seguida, redimensioná-la.
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;
//Upload File
$request->file('profile_image')->storeAs('public/profile_images', $filenametostore);
$request->file('profile_image')->storeAs('public/profile_images/thumbnail', $filenametostore);
//Resize image here
$thumbnailpath = public_path('storage/profile_images/thumbnail/'.$filenametostore);
$img = Image::make($thumbnailpath)->resize(400, 150, function($constraint) {
$constraint->aspectRatio();
});
$img->save($thumbnailpath);
return redirect('image')->with('success', "Image uploaded successfully."); //change the route as per your flow
}
}
Aqui estou redimensionando a imagem proporcionalmente. Fazendo isso, você mantém a proporção da imagem e a imagem não é cortada. Passei a largura como 400 e a altura como 150. Você pode alterar esses valores de acordo com sua necessidade.
Se você está procurando um corte difícil, substitua as linhas abaixo
$img = Image::make($thumbnailpath)->resize(400, 150, function($constraint) {
$constraint->aspectRatio();
});
$img->save($thumbnailpath);
Com
$img = Image::make($thumbnailpath)->resize(100, 100)->save($thumbnailpath);
Depois disso, você obterá a miniatura com uma dimensão de 100 * 100.
Espero que você possa aprender como redimensionar a imagem no Laravel usando a biblioteca de Imagens de Intervenção. Por favor, compartilhe seus pensamentos e sugestões na seção de comentários abaixo.
Artigos relacionados
- Otimização de imagens usando o pacote artisansweb / image-otimizer
- Um guia para fazer upload e compactar imagens no Laravel
- Redimensionar imagem em PHP usando TinyPNG