Автоматизация редактирования изображений в ImageMagick - это просто!

24.08.23

Разработка - Работа с интерфейсом

На что способен ImageMagick и некоторые неочевидные моменты при интеграции его в 1С.

 

Что такое ImageMagick

ImageMagick (IM) - свободный графический редактор, ключевой (для нас здесь, в частности) особенностью которого является возможность описать шаблоны редактирования изображения как набор команд терминала или командной строки. 

Команд для редактирования огромное количество, а их комбинаций - еще больше, что описано достаточно подробно в официальной документации, но:

  1. Она на английском
  2. Примеры все сделаны Unix-like

Что зачастую исключает возможность просто скопировать и вставить интересующий пример в Powershell, а далее и в 1С, если вы пользователь наиболее популярной и православной в желтых кругах операционной системы. Поэтому примеры здесь все под Powershell.

 

Где может пригодиться IM?

В любом месте, где одни однотипные картинки нужно превращать в другие однотипные картинки. Например:

- Накладывать водяные знаки

- Делать что-нибудь черно-белым

- Делать из одной картинки несколько, но в разных размерах

- Сделать машину по производству смешных картинок для канала в Телеграм

Последнее, конечно же, шутка


 

На самом деле, те примеры, которые я буду приводить дальше - это часть pet-проекта собственной системы управления контентом для группы ВК и Телеграм канала, которая зашла слишком далеко. Едва ли вам понадобится нечто подобное, но вариации команд, описанные там, без проблем покроют операции работы с картинками из карточек номенклатуры, например.

 

Как работать?

Я не буду рассказывать, как установить IM, просто оставлю ссылку. Ближе к низу страницы под надписью Windows Binary Release. Устанавливается просто из exe файла. После установки IM становится доступен как команда Powershell или командной строки, с чего мы и начнем.

Первое что нужно отметить - писать сразу в 1С - не удобно. Куда проще сделать скрипт в PS, а потом уже перенести его в 1С. Для задач начальной разработки отлично подходит Powershell ISE: Нужно лишь создать файл .ps1. К слову, ISE решает каким-то образом и другую проблему обычного Powershell - кириллицу. Я не суперуверенный пользователь Powershell и у меня русскоязычный Windows Server, поэтому первое столкновение с "powershellexe завершил свою работу" при вводе пути до картинки с кириллическими символами, вызвало у меня фрустрацию. Возможно у вас таких проблем с кодировкой не будет (или вы знаете, как их решить), но если нет, то ISE - ваш лучший друг.

 

Кейс: изменение размера, накладывание маски, текст на картинке

Я уже говорил про группу в ВК и Телеграм? Мог бы, конечно, оставить ссылку, но вы теперь знаете, что контент там создает бездушная машина. Первый кейс - создание картинки на день рождения великого человека. Группа про философию и литературу, поэтому подобные темы - настоящее сокровище. Только подумайте: 3 минуты работы и у тебя есть актуальный пост на каждый год. Выглядит этот пост вот так:


 

Состоит из:

 

 

Первая картинка - фото (3.jpg), вторая - маска (bd.png). Здесь она выглядит серой, но вообще фон полупрозрачный. Хотя тут будет и пример затемнения фона без маски. Вот так выглядит сам скрипт в ISE

convert -resize 1143x643 3.jpg 3.jpg 
magick 3.jpg bd.png -grayscale Rec709Luminance  -geometry 1143x643  -gravity Center -composite final.jpg  

magick final.jpg -pointsize 60 -fill white -font Sylfaen -gravity Center -annotate +0+70 'Олдос Хаксли' final.jpg
magick final.jpg -pointsize 27 -fill white -font Tahoma -gravity Center -annotate +0+123 '26 июля 1894г.' final.jpg


Что мы тут видим?
 

convert -resize 1143x643 3.jpg 3.jpg 

convert (часть IM) используется в данном случае для изменения размера фотографии к 1134х643. Если исходное фото больше - сжимает, если меньше - растягивает. Важный момент: при указании размера 1143х643 IM попытается вогнать в него картинку пропорционально по одной стороне, не искажая изображения. Т.е. если вы попытаетесь вогнать прямоугольник в квадрат, то у вас все равно останется прямоугольник, но размер будет совпадать по одной стороне. Для изменения размера без сохранения пропорции по стороне нужно использовать "!" - 1143х643!. Далее, после размера, идет просто два пути к файлам: первый - входной, второй - после обработки. Это может быть, как здесь, один и тот же файл.

magick 3.jpg bd.png -grayscale Rec709Luminance  -geometry 1143x643  -gravity Center -composite final.jpg 

В данной строке после команды magick идет два пути к файлу для последующего использования -composite: нижний слой, а затем верхний. -grayscale Rec709Luminance - один из вариантов превращения картинки в черно белую, т.е фильтр. -gravity Center определяет положение верхнего слоя (bd.png) на нижнем (3.jpg). В данном случае, первой строкой скрипта у меня фото подгоняется под размер маски (1143х643), а значит она (маска) будет занимать всю площадь нижнего слоя (собственно фото). Но если вы накладываете картинку меньшего размера, тот же водяной знак, например, то gravity будет определять начальную точку ее положения на полотне. Далее мы еще рассмотрим это подробнее.

magick final.jpg -pointsize 60 -fill white -font Sylfaen -gravity Center -annotate +0+70 'Олдос Хаксли' final.jpg
magick final.jpg -pointsize 27 -fill white -font Tahoma -gravity Center -annotate +0+123 '26 июля 1894г.' final.jpg

Эти строки обе накладывают текст. В начале путь к файлу, затем -pointsize - размер шрифта, -fill - цвет текста, -font - шрифт (посмотреть список всех шрифтов можно командой 

convert -list font

-gravity - начальное положение текста. Значения также можно посмотреть командой. Они, в большинстве, представлены сторонами света:

convert -list gravity

 

 

-annotate непосредственно рисует текст. В начале идут значения +0+70 - это отступ от точки, выбранной в gravity. Например: gravity Center ровняет текст в центр изображения, а +100+50 опускает его на 100 пунктов вниз и на 50 вправо. При создании своего шаблона это, как правило подбирается методом проб и ошибок. Затем в одинарных кавычках идет текст и после - путь к выходному файлу.

Все, наш шаблон готов, осталось лишь перенести его в 1С. Если у вас, как и у меня, возникли сложности с кодировкой кириллицы, то здесь тоже придется провернуть несколько лишних телодвижений. Все знают метод ЗапуститьПриложение(), но в данном случае просто запихнуть туда текст скрипта не вышло. Решение было найдено следующее:

  1. Создать текстовый документ
  2. Записать в него текст скрипта
  3. Записать скрипт во временный файл расширения ps1
  4. Выполнить файл через ЗапуститьПриложение("powershell -file " + ИмяСкрипта, ,Истина, КодВозврата)

Вот как это выглядит:

	ИмяСкрипта				= ПолучитьИмяВременногоФайла(".ps1");
	ТекстСкрипта			= Новый ТекстовыйДокумент();
			
	ТекстСкрипта.УстановитьТекст(
	"convert -resize 1143x643 """ 
	+ Путь + """ """ 
	+ Путь 
	+ """" 
	+ Символы.ПС 
	+ "magick """ 
	+ Путь 
	+ """ """ 
	+ ПутьМаска 
	+ """" 
	+ " -grayscale Rec709Luminance  -geometry 1143x643 -gravity Center -composite """ 
	+ Путь
	+ """" 
	+ Символы.ПС 
	+"magick """ 
	+ Путь 
	+ """ -pointsize 50 -fill white -font Sylfaen -gravity Center -annotate +0+70 '" 
	+ ВыборкаДетальныеЗаписи.Имя 
	+ " " 
	+ ВыборкаДетальныеЗаписи.Фамилия 
	+ "' """ 
	+ Путь + """" 
	+ Символы.ПС 
	+ "magick """ 
	+ Путь 
	+ """ -pointsize 24 -fill white -font Tahoma -gravity Center -annotate +0+117 '" 
	+ Формат(ВыборкаДетальныеЗаписи.ДР, "ДЛФ=DD") 
	+ "' """ 
	+ Путь 
	+ """"		
	);
			
	ТекстСкрипта.Записать(ИмяСкрипта, КодировкаТекста.UTF8);
			
	КодВозврата = 0;
	ЗапуститьПриложение("powershell -file " + ИмяСкрипта, ,Истина, КодВозврата);
	УдалитьФайлы(ИмяСкрипта);

Важно: пути лучше окружать двойными кавычками.

Вот и все. Собственно любые значения, будь то размеры шрифтов, цвета или отступы можно тоже заменять на переменные. Сейчас посмотрим еще несколько вариантов.


Еще несколько вариантов скриптов

1. Рекламка книги из онлайн библиотеки 


Скрипт PS:

convert -resize 365x528! book1.png book1.png
convert "book1.png"   +clone  -background black  -shadow 80x3+5+5  +swap -background none   -layers merge  +repage    shadow.png

magick bookpattern.png shadow.png -geometry +125+510 -composite book.png
magick book.png book1.png -geometry +120+500 -composite book.png

magick book.png bookframe.png -geometry +120+500 -composite book.png
magick book.png -pointsize 32 -fill white -font Sylfaen -gravity South -annotate -210+120 'Королева Марго' book.png
magick book.png -pointsize 22 -fill grey -font Tahoma -gravity South -annotate -210+90 'Александр Дюма' book.png
magick book.png -pointsize 88 -fill white -font Sylfaen -gravity Center -annotate +0-290 'Королева Марго' book.png
magick book.png -pointsize 24 -fill grey -font Tahoma -gravity Center -annotate +0-220 'Александр Дюма в библиотеке Two-Digit Athenaeum'book.png
magick book.png -pointsize 66 -fill grey -font Sylfaen -gravity South -annotate +160+330 'по коду:' book.png
magick book.png -pointsize 120 -fill white -font Tahoma -gravity South -annotate +200+195 '9VAN2' book.png
convert -resize 768x768 book.png book.png

P.S. Из нового - строки 2 и 3. В строке 2 создается png тени от book1.png, а в 3 - тень накладывается на фон. На фоне уже есть темное пятно, да, но тень из скрипта тоже рабочая.

В 1С:

Функция СформироватьРекламуКниги(Знач Книга) Экспорт
	
	ФонДД 	= Справочники.Файлы.РК_Фон.Файл.Получить();
	Фон		= ПолучитьИмяВременногоФайла(".png");
	ФонДД.Записать(Фон);
	
	РамкаДД = Справочники.Файлы.РК_Рамка.Файл.Получить();
	Рамка	= ПолучитьИмяВременногоФайла(".png");
	РамкаДД.Записать(Рамка);
	
	ОбъектКнига = Книга.ПолучитьОбъект();
	
	КартинкаКнигиДД = ОбъектКнига.КартинкаДвоичные.Получить();
	КартинкаКниги 	= ПолучитьИмяВременногоФайла(".png");
	КартинкаКнигиДД.Записать(КартинкаКниги);
	
	КодКниги 		= ОбъектКнига.Код;
	НазваниеКниги 	= ОбъектКнига.Наименование;
	АвторКниги 		= ОбъектКнига.Автор.Имя + " " + ОбъектКнига.Автор.Фамилия;
	
	КартинкаОбработанная = ПолучитьИмяВременногоФайла(".png");
	
	МассивВФ = Новый Массив;
	МассивВФ.Добавить(Фон);
	МассивВФ.Добавить(Рамка);
	МассивВФ.Добавить(КартинкаКниги);
	
	
	ИмяСкрипта				= ПолучитьИмяВременногоФайла(".ps1");
	ТекстСкрипта			= Новый ТекстовыйДокумент();
	ТекстСкрипта.УстановитьТекст(
	
	"convert -resize 365x528! """
	+ КартинкаКниги
	+ """ """
	+ КартинкаКниги
	+ """"
	+ Символы.ПС
	+ "magick """
	+ Фон
	+ """ """
	+ КартинкаКниги
	+ """ -geometry +120+500 -composite """
	+ КартинкаОбработанная
	+ """"
	+ Символы.ПС
	+ "magick """
	+ КартинкаОбработанная
	+ """ """
	+ Рамка
	+ """ -geometry +120+500 -composite """
	+ КартинкаОбработанная
	+ """"
	+ Символы.ПС
	+ "magick """
	+ КартинкаОбработанная
	+ """ -pointsize 32 -fill white -font Sylfaen -gravity South -annotate -210+120 '"
	+ НазваниеКниги
	+ "' """
	+ КартинкаОбработанная
	+ """"
	+ Символы.ПС
	+ "magick """
	+ КартинкаОбработанная
	+ """ -pointsize 22 -fill grey -font Tahoma -gravity South -annotate -210+90 '"
	+ АвторКниги
	+ "' """
	+ КартинкаОбработанная
	+ """"
	+ Символы.ПС
	+ "magick """
	+ КартинкаОбработанная
	+ """ -pointsize 88 -fill white -font Sylfaen -gravity Center -annotate +0-290 '"
	+ НазваниеКниги
	+ "' """
	+ КартинкаОбработанная
	+ """"
	+ Символы.ПС
	+ "magick """
	+ КартинкаОбработанная
	+ """ -pointsize 24 -fill grey -font Tahoma -gravity Center -annotate +0-220 '"
	+ АвторКниги
	+ " в библиотеке Two-Digit Athenaeum'"""
	+ КартинкаОбработанная
	+ """"
	+ Символы.ПС
	+ "magick """
	+ КартинкаОбработанная
	+ """ -pointsize 66 -fill grey -font Sylfaen -gravity South -annotate +160+330 'по коду:' """
	+ КартинкаОбработанная 
	+ """"
	+ Символы.ПС
	+ "magick """
	+ КартинкаОбработанная
	+ """ -pointsize 120 -fill white -font Tahoma -gravity South -annotate +200+195 '"
	+ КодКниги
	+ "' """
	+ КартинкаОбработанная
	+ """"
	+ Символы.ПС
	+ "convert -resize 768x768 """
	+ КартинкаОбработанная
	+ """ """
	+ КартинкаОбработанная
	+ """"

	
	);
	
	ТекстСкрипта.Записать(ИмяСкрипта, КодировкаТекста.UTF8);

	КодВозврата = 0;
	ЗапуститьПриложение("powershell -file " + ИмяСкрипта, ,Истина, КодВозврата);
	
	УдалитьФайлы(ИмяСкрипта);
	
	СтруктураВозврата = Новый Структура;
	СтруктураВозврата.Вставить("Картинка", КартинкаОбработанная);
	СтруктураВозврата.Вставить("МассивВФ", МассивВФ);
	
	Возврат СтруктураВозврата
	
КонецФункции

 

2. Создание карточек разного размера по пути к файлу

Сразу перейду к 1С. Ничего сложного этот код не делает: берет путь к файлу из параметра и обходит соответствие, где ключ - имя файла, а значение - размер. Сохраняется все в webp рядом с основной картинкой 

Процедура СоздатьКарточки(Знач ПутьКОригиналу) Экспорт
	
	Картинка 		= Новый Файл(ПутьКОригиналу);
	Путь			= Картинка.Путь;
	Размеры 		= Новый Соответствие;
	
	Размеры.Вставить("small"	, "175x270");
	Размеры.Вставить("medium"	, "295x455");
	
	Для Каждого Размер Из Размеры Цикл
		
		РазмерМассив = СтрРазделить(Размер.Значение, "x");
		Ширина 	= РазмерМассив[0];
		Высота	= РазмерМассив[1];
		
		ИмяСкрипта				= ПолучитьИмяВременногоФайла(".ps1");
		ТекстСкрипта			= Новый ТекстовыйДокумент();
		ТекстСкрипта.УстановитьТекст(
		"magick convert -resize " + Ширина + "x -unsharp 0x0.55+0.55+0.008 -quality 90 "
		+ ПутьКОригиналу 
		+ " "
		+ Путь 
		+ Размер.Ключ 
		+ ".webp"
		
		+ Символы.ПС +
		
		"convert "
		+ Путь 
		+ Размер.Ключ
		+ ".webp"
		+ " -resize " + Размер.Значение + "! -gravity North -extent " + Размер.Значение + " "
		+ Путь 
		+ Размер.Ключ
		+ ".webp"
		);
		
		ТекстСкрипта.Записать(ИмяСкрипта, КодировкаТекста.UTF8);				
		КодВозврата = 0;
		ЗапуститьПриложение("powershell -file " + ИмяСкрипта + " -noexit", ,Истина, КодВозврата);
		
		УдалитьФайлы(ИмяСкрипта);
		
	КонецЦикла;
	
КонецПроцедуры

Из незнакомого здесь: -quality и -unsharp. -quality может резать качество, что уменьшает вес картинки. Как работает unsharp никто не знает, но он снижает блюр при изменении размеров.

 

3. Еще один способ рисовать текст

 

Рисует текст с подкладкой. Для этого используется вообще другой механизм: не -annotate, а -draw

magick event.jpg -fill white -stroke white -undercolor black -font Sylfaen -pointsize 28 -gravity SouthWest -draw "text 130,65 'Пабло Пикассо, Симона де Бовуар, Жан-Поль Сартр,\n Альбер Камю и другие'" event.jpg

-stroke определяет цвет контура символов, -fill - цвет заливки, -udercolor - цвет подложки. 130, 65 после текст - те же +130+65 у annotate

Важно: \n - перенос строки

1С:

"magick """
	+ КартинкаОбработанная
	+ """ -fill white -stroke white -undercolor black -font Tahoma -pointsize 18 -gravity SouthWest -draw ""text 130,30 '"
	+ Место
	+ ", "
	+ ДатаСобытия
	+ "'"" """
	+ КартинкаОбработанная
	+ """"

Вот и вся "картиночная магия". Надеюсь, было полезно.

Изображения Imagemagick Работа с картинками Картинки Обработка изображений

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    62130    43    59    

81

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    16920    22    4    

36

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    11210    762    elcoan    45    

106

HTTP, Ajax, JSON: Один год Pet-проекту на 1С

WEB-интеграция Платформа 1С v8.3 Бесплатно (free)

Как 1С может стать площадкой для хобби и что из этого может получиться.

27.11.2023    4276    bayselonarrend    6    

41

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

Подходит для создания web-страниц для замены управляемых форм 1С, красивых отчетов, интерфейса мобильного приложения на платформе 1С и для простых страниц веб-сайтов.

2 стартмани

10.04.2023    9917    153    acces969    31    

119

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3962    kalyaka    4    

29

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12317    1    5    

10

Условное оформление элементов форм в пользовательском режиме 1С (управление видимостью и доступностью элементов форм)

Работа с интерфейсом Платформа 1С v8.3 Платные (руб)

Подсистема условного оформления элементов форм (далее подсистема) предназначена для настройки оформления элементов форм (видимость, доступность, цвет фона, цвет текста и прочее) в пользовательском режиме 1С. Также подсистему возможно использовать для ограничения доступа к реквизитам формы для определенных пользователей (или групп пользователей).

6000 руб.

18.01.2022    8963    1    2    

6
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. melenaspb 208 25.08.23 12:32 Сейчас в теме
Не подскажите как с помощью ImageMagick можно нанести на файл штамп c рамкой? Есть примеры как добавить штамп с названием организации, датой и номером, но как сделать чтобы была рамка? И чтобы текст в штампе был центрирован, длина выводимой даты и номера ведь меняется.
3. bayselonarrend 1226 26.08.23 12:34 Сейчас в теме
(1) При нанесении текста функцией -annotate он центрируется по умолчанию (т.е. растет в стороны, а центр остается в выбранной через -gravity и отступы точке).

Что касается рамки: в IM можно рисовать фигуры. Например прямоугольник

magick -size 100x60 xc:none -stroke black -fill none -draw "rectangle 20,10 80,50"  1.png


Он сохраняется как картинка и его можно наложить на документ как и любую другую. Либо сделать рамку в paint или photoshop и также соединить их с картинкой документа (при помощи -composite, как в примерах из статьи). Все это, так или иначе, соединение двух файлов картинок, будь то созданной самим IM или заранее подготовленных.
melenaspb; +1 Ответить
2. kser87 2441 25.08.23 16:37 Сейчас в теме
А можно например поставить факсимиле на документ?
4. bayselonarrend 1226 26.08.23 12:38 Сейчас в теме
(2) Можно, но нужно иметь факсимиле как картинку. Накладывается через -composite как в первом примере или примере с рекламой книги

magick Фон.png Факсимиле.png -geometry +[Отступ слева]+[Отступ сверху] -composite Результат.png
5. bayselonarrend 1226 26.08.23 12:39 Сейчас в теме
(2)P.S. Документ тоже должен быть картинкой
6. kser87 2441 28.08.23 10:14 Сейчас в теме
(5) то есть pdf не подойдет?
7. bayselonarrend 1226 28.08.23 12:30 Сейчас в теме
(6)Нет, но IM умеет конвертировать PDF в JPG и наоборот
convert 1.pdf 1.jpg 

convert 1.jpg 1.pdf
serkorvin; +1 Ответить
8. kser87 2441 28.08.23 12:47 Сейчас в теме
(7) вот это реально полезная информация раньше для конвертации JPG в PDF мы:

1) делали макет
2) выводили в макет картинку
3) сохраняли табличный документ в формате pdf.

При этом в 10% случаев 100 кб картинка превращалась в несколько мегабайт.
9. Lusha_28 48 14.09.23 13:30 Сейчас в теме
Привет! а как можно сравнить картинки? Например, я программно копирую с фтп картинки и складываю их в присоединенные файлы документа. Можно как-то перед присоединением проверить, что все эти картинки все разные?
10. alwiz3 26.09.23 12:30 Сейчас в теме
(9) Если имеется в виду, что это будет тот же файл, что присоединен ранее, то или результат
fc /b
, или расчет и сравнение хешей (можно тем же IM
magick identify -quiet -format "%#" 
). Если хочется заморочиться с похожестью:
magick compare -metric AE
, например, и парсить результат.
Lusha_28; +1 Ответить
11. serkorvin 27.03.24 11:16 Сейчас в теме
Добрый день!
А можно накладываемый текст/картинку делать полупрозрачными?
12. пользователь 02.04.24 14:36
Сообщение было скрыто модератором.
...
13. пользователь 02.04.24 14:39
Сообщение было скрыто модератором.
...
Оставьте свое сообщение