функционал по ресайзу и наложению ватермарки на прозрачную анимированную гифку.

Этот коммит содержится в:
Igor V Belousov 2019-06-22 19:43:49 +03:00
родитель 4aecbb2b5d
Коммит 9f50310a92
8 изменённых файлов: 132 добавлений и 1 удалений

Просмотреть файл

@ -33,3 +33,4 @@ security:
access_control:
- { path: ^/admin, roles: ROLE_ADMIN }
- { path: ^/follow_plugin, roles: ROLE_USER }
- { path: ^/gif_modify, roles: ROLE_USER }

Двоичные данные
public/img/PHP.png Обычный файл

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 12 KiB

Двоичные данные
public/img/circle_php.png Обычный файл

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 9.3 KiB

Двоичные данные
public/img/original.gif Обычный файл

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 193 KiB

Просмотреть файл

@ -4,6 +4,7 @@ namespace App\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use App\Utils\GifModifier;
class IndexController extends AbstractController
{
@ -22,4 +23,47 @@ class IndexController extends AbstractController
{
return $this->render('follow.html.twig');
}
/**
* @Route("/gif_modify", name="gif_page", methods={"GET"})
*/
public function gifModify()
{
return $this->render('gif_modify.html.twig', [
'result' => false,
]);
}
/**
* @Route("/gif_modify/process", name="gif_process_page", methods={"GET"})
*/
public function gifModifyProcess()
{
$img_dir = dirname(dirname(__DIR__)).'/public/img/';
$gifModify = new GifModifier();
$gifModify->modify($img_dir.'original.gif', 180, 146, $img_dir.'PHP.png', 36, 52, $img_dir.'out_180_146.gif');
$gifModify->modify($img_dir.'original.gif', 300, 243, $img_dir.'circle_php.png', 88, 152, $img_dir.'out_300_243.gif');
return $this->redirectToRoute('gif_result_page');
}
/**
* @Route("/gif_modify/results", name="gif_result_page", methods={"GET"})
*/
public function gifModifyResults()
{
return $this->render('gif_modify.html.twig', [
'result' => true,
'images' => [
[
'x' => 180,
'y' => 146,
],
[
'x' => 300,
'y' => 243,
],
],
]);
}
}

54
src/Utils/GifModifier.php Обычный файл
Просмотреть файл

@ -0,0 +1,54 @@
<?php
/**
* Ресайз и наложение ватермарки на прозрачную анимированную гифку.
*/
namespace App\Utils;
use Imagick;
/**
* Class GifModifier.
*
* Ресайз и наложение ватермарки на прозрачную анимированную гифку
*/
class GifModifier
{
/**
* Ресайз и наложение ватермарки на прозрачную анимированную гифку.
*
* @param string $filename Путь к исходному gif-файлу
* @param int $width Новый размер по горизонтали
* @param int $height Новый размер по вертикале
* @param string $watermarkFilename Путь к водному знаку. gif или png
* @param int $watermarkX Позиция водного знака по горизонтали
* @param int $watermarkY Позиция водного знака по вертикали
* @param string $outFilename Путь для записи результата
*/
public function modify(string $filename, int $width, int $height, string $watermarkFilename, int $watermarkX, int $watermarkY, string $outFilename)
{
$watermark = new Imagick();
$watermark->readImage($watermarkFilename);
$gifFile = new Imagick($filename);
$fileFormat = $gifFile->getImageFormat();
if ('GIF' == $fileFormat) {
$frames = $gifFile->coalesceImages();
foreach ($frames as $frame) {
$frame->resizeImage($width, $height, Imagick::FILTER_LANCZOS, 1);
$frame->compositeImage($watermark, Imagick::COMPOSITE_OVER, $watermarkX, $watermarkY);
}
$out_file = $frames->deconstructImages();
$out_file->writeImages($outFilename, true);
$out_file->clear();
}
$gifFile->clear();
$watermark->clear();
}
}

27
templates/gif_modify.html.twig Обычный файл
Просмотреть файл

@ -0,0 +1,27 @@
{% extends "base.html.twig" %}
{% block title %}
Ресайз и наложение ватермарки{% if result == true %} (Результат){% endif %}.
{% endblock %}
{% block body %}
<div class="container">
{% if result == false %}
<a href="{{ path('index_page') }}" class="btn btn-primary mb-5">← Главная</a>
<br>
<a href="{{ path("gif_process_page") }}" class="btn btn-success js-gif">Изменить gif</a>
{% else %}
<a href="{{ path('gif_page') }}" class="btn btn-primary mb-5">← Страница изменения gif</a>
<br>
<div class="h3 mb-5">original.gif</div>
<img src="/img/original.gif" alt="" width="350" height="284" class="img-thumbnail">
<div class="h3 mb-5">circle_php.png</div>
<img src="/img/circle_php.png" height="50" width="50" class="img-thumbnail">
<div class="h3 mb-5">PHP.png</div>
<img src="/img/PHP.png" width="80" height="42" class="img-thumbnail">
{% for image in images %}
<hr>
<div class="h3 mb-5">out_{{ image.x }}_{{ image.y }}.gif</div>
<img src="/img/out_{{ image.x }}_{{ image.y }}.gif" alt="" width="{{ image.x }}" height="{{ image.y }}" class="img-thumbnail mb-5">
{% endfor %}
{% endif %}
</div>
{% endblock %}

Просмотреть файл

@ -11,7 +11,12 @@
{% endif %}
<br class="mb-5">
{% if is_granted('ROLE_USER') %}
<a href="{{ path('follow_page') }}" class="btn btn-primary">Плагин follow</a>
<a href="{{ path('follow_page') }}" class="btn btn-primary mb-1">Плагин follow</a>
<br>
<a href="{{ path('gif_result_page') }}" class="btn btn-primary mb-1">Результат изменения gif</a>
<br>
<a href="{{ path('gif_page') }}" class="btn btn-primary mb-1">Страница изменения gif</a>
<br>
{% endif %}
{% if is_granted('ROLE_ADMIN') %}
<a href="{{ path('user_index') }}" class="btn btn-primary">Список пользователей</a>