Что у меня было:
1С:Предприятие 8.3 (8.3.24.1548) и пустая конфигурация.
Microsoft Visual Studio Community 2022.
Реализован базовый функционал.
В архиве исходники С++ и проект VS, можно дописать что угодно.
Начнем с описания методов:
Строка = GetStatus(); возвращает информационную структуру json о результате выполнения последней функции и дополнительные данные этих функций.
Строка = GetDC(); возвращает информационную структуру json, настроек по умолчанию, данных для рисования. Структура является основанием для заполнения параметров в функциях, в которых они не заполнены.
Строка = GetImageInfo(); возвращает информационную структуру json, описывающую загруженное изображение.
Строка = GetWindowsSize(); возвращает информационную структуру json. Размер экрана, верхнего окна и размер картинки.
bool LoadImage(Путь к файлу строка или Двоичные данные картинки). Загружает картинку.
Возвращает: Истина все нормально, Ложь - есть ошибка, также как и все функции ниже. Подробности в функции GetStatus();
bool CreateImage(Ширин число, Высота число). Создает картинку по размерам с белым фоном.
bool View(). Открывает окно с загруженной картинкой.
bool DrawString(Строка , Настройки(не обязательно) - строка json) . Рисует текст на картинке.
Описание параметров см выше. заполнять все параметры не обязательно.
bool DrawShape(Строка имя фигуры , Настройки- строка json) . Рисует фигуры на картинке.
Описание параметров см выше. заполнять все параметры не обязательно.
фигуры: "rect","ellipse","pie"- обязательно структура "Rect";
фигура "polygon" обязательно массив "Points".
bool CreatePrtSc(Настройки- (не обязательно) строка json). Создает скрин экрана или верхнего окна.
структура:
{X=0, Y=0, width=100, height=100, ForegroundWindow=true}
bool или ДД SaveAs(строка Имя файла или пусто, Настройки(не обязательно) - строка json). Сохраняет картинку. Если сохраняем файл, тогда булево если имя файла не указано (параметр по умолчанию) двоичные данные.
А теперь вместо много текста - много кода (код конечно абстрактный не пинайте сильно):
&НаСервере
функция ПолучитьДДНаСервере(ИмяМакета)
Возврат РеквизитФормыВЗначение("Объект").ПолучитьМакет(ИмяМакета);
КонецФункции
&НаКлиенте
Асинх Функция СоздатьКомпоненту()
Компонента = Неопределено;
СистемнаяИнформация = Новый СистемнаяИнформация;
//Получаем двоичные данные длл-ки в соотвесвии с платформой клиента
ДвоичныеДанныеДЛЛ = ПолучитьДДНаСервере(?(СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64, "DLL64", "DLL32"));
ИмяФайлаДЛЛ = ПолучитьИмяВременногоФайла();
ДвоичныеДанныеДЛЛ.Записать(ИмяФайлаДЛЛ);
//создаем из файла
Если Ждать ПодключитьВнешнююКомпонентуАсинх(ИмяФайлаДЛЛ, "malimgdrvdll", ТипВнешнейКомпоненты.Native) Тогда
Компонента = Новый("AddIn.malimgdrvdll.mal_img_drv");
Сообщить(Ждать Компонента.ПолучитьVersionАсинх()); //Версия обработки.
КонецЕсли;
//Больше файл длл не нужен.
УдалитьФайлыАсинх(ИмяФайлаДЛЛ);
Если Компонента = Неопределено Тогда
ВызватьИсключение "Что-то пошло не так!?";
КонецЕсли;
Возврат Компонента;
КонецФункции
&НаКлиенте
Асинх Процедура ОбработатьКартинку(Команда) //эта кнопка на форме
ПоследнийСтатус = Новый Структура;
Компонента = Ждать СоздатьКомпоненту();
ДвоичныеДанныеОригинал = ПолучитьДДНаСервере("png");
//загружаем картинку из Двоичных данных
Ждать Компонента.LoadImageАсинх(ДвоичныеДанныеОригинал);
//Паследний статус в DATA - данные картики
ПоследнийСтатус = Ждать ОбновитьСтатус(Компонента); //ошибка будет в сообщении
//Картику сохраняю в файл как есть без фильтров
Ждать Компонента.SaveAsАсинх(ДиректорияКартинок + "origen.png");
//Картику из файл как есть без фильтров
Ждать Компонента.LoadImageАсинх(ДиректорияКартинок + "origen.png");
ПоследнийСтатус = Ждать ОбновитьСтатус(Компонента); //ошибка будет в сообщении
//Картику сохранили в двоичные данные как есть без фильтров
//И на форму это действо только для демонстрации возможностей
Ожидания = Ждать Компонента.SaveAsАсинх();
КартинкаОригенал = ПоместитьВоВременноеХранилище(Новый Картинка(Ожидания.Значение), УникальныйИдентификатор);
//Читем информацию о текущей картинке
Ожидания = Ждать Компонента.GetImageInfoАсинх();
ИнформацияОКартинки = ПрочитатьЗначениеJSON(Ожидания.Значение);
//Читем настройки поумолчанию
Ожидания = Ждать Компонента.GetDCАсинх();
НастройкиПоУмолчанию = ПрочитатьЗначениеJSON(Ожидания.Значение);
//-------------------------------------------------------------------------
//Напишем первую строку с настройками по умолчанию
Ждать Компонента.DrawStringАсинх("Тест №1 одна строка.");
//-------------------------------------------------------------------------
//Вторая строка созданим свои настройки другой шрифт и размер вырвнивание.
//Alignment имеет смысл когда строка вписана в прямоугольник или многостроный текст
Настройки = Новый Структура("Text, Point", Новый Структура("Font, Alignment"
, Новый Структура("Size, Name, Style", 32, "Segoe Script", "FontStyleBold"), "StringAlignmentCenter")
, Новый Структура("X,Y", 100, 30.4));
//Остальные не заполненые параметры будут заполнены по умолчанию
Ждать Компонента.DrawStringАсинх("Тест №2 2 строки" + Символы.ПС + "стр 2 шрифт и выравнивания"
, ЗаписатьЗначениеJSON(Настройки)); //Передадим настройки стракой json
////-------------------------------------------------------------------------
//третя строка - тестируем градиент текста, на основе настроек по умолчанияю.
НастройкиПоУмолчанию.Point.Y = Настройки.Point.Y + 100;//Сдвигаемся вниз на основании преведущей надписи
НастройкиПоУмолчанию.Text.Font.Size = 52;
НастройкиПоУмолчанию.Text.Color.Red = 255;
НастройкиПоУмолчанию.Text.LinearGradientColor.Color.Green = 255;
НастройкиПоУмолчанию.Text.LinearGradientColor.Point.X = 10;
Ждать Компонента.DrawStringАсинх("Тест №3 ГРАДИЕНТ ЦВЕТА", ЗаписатьЗначениеJSON(НастройкиПоУмолчанию));
//Паследний статус в DATA - прямоугольник в который вписали текст
ПоследнийСтатус = Ждать ОбновитьСтатус(Компонента);
//-------------------------------------------------------------------------
//4 строка - Вписываем текст в прямоугольник "Rect" вместо "Pain"
//синим цветом с выравниванием выставили выше по коду (Настройки.Вставить("Alignment", "StringAlignmentCenter"))
//ПоследнийСтатус.Data.Y - получаем из статуа преведущей операции
Настройки.Text.Font.Size = 16;
Настройки.Text.Font.Name = "Arial";
Настройки.Удалить("Point");
Настройки.Text.Удалить("LinearGradientColor");
Настройки.Text.Вставить("Color", Новый Структура("Blue", 255));
Настройки.Вставить("Rect", Новый Структура("X,Y,Width,Height", 0, ПоследнийСтатус.Data.Y + 100, 100, 100));
Ждать Компонента.DrawStringАсинх("Тест №4 строка1 строка2 строка3", ЗаписатьЗначениеJSON(Настройки));
ПоследнийСтатус = Ждать ОбновитьСтатус(Компонента);
//-------------------------------------------------------------------------
//5 строка - Прозрачность
Настройки.Text.Вставить("Color", СоздатьЦветGDI(WebЦвета.Красный, 50));
Настройки.Удалить("Rect");
Настройки.Вставить("Point", Новый Структура("X,Y",ПоследнийСтатус.Data.X + 100, ПоследнийСтатус.Data.Y));
Настройки.Text.Font.Size = 32;
Настройки.Text.Font.Вставить("Style", "FontStyleBold");
Ждать Компонента.DrawStringАсинх("Тест №5 Прозрачность", ЗаписатьЗначениеJSON(Настройки));
ПоследнийСтатус = Ждать ОбновитьСтатус(Компонента);
//-------------------------------------------------------------------------
//6. заливка под текстом
Настройки.Text.Удалить("Color");
Настройки.Point = Новый Структура("X, Y", ПоследнийСтатус.Data.X, ПоследнийСтатус.Data.Y + ПоследнийСтатус.Data.Height);
Настройки.Вставить("Filling", Новый Структура("Color", СоздатьЦветGDI( ,80)));
Ждать Компонента.DrawStringАсинх("Тест №6 заливка", ЗаписатьЗначениеJSON(Настройки));
ПоследнийСтатус = Ждать ОбновитьСтатус(Компонента);
//-------------------------------------------------------------------------
//7. заливка под текстом и цетной рамкой то толщине 10 точек
Настройки.Point.X = ПоследнийСтатус.Data.X;
Настройки.Point.Y = ПоследнийСтатус.Data.Y + ПоследнийСтатус.Data.Height;
Настройки.Filling.Color = СоздатьЦветGDI();
Настройки.Вставить("Borders", Новый Структура("Color, Width", Новый Структура( "Alpha, Green", 255, 255), 10));
Ждать Компонента.DrawStringАсинх("Тест №7 заливка c рамкой", ЗаписатьЗначениеJSON(Настройки));
ПоследнийСтатус = Ждать ОбновитьСтатус(Компонента);
//-------------------------------------------------------------------------
//8. только рамка то толщине 5 точек
Настройки.Point = Новый Структура("X, Y", ПоследнийСтатус.Data.X, ПоследнийСтатус.Data.Y + ПоследнийСтатус.Data.Height + 10);
Настройки.Удалить("Filling");
Настройки.Borders = Новый Структура("Color, Width", Новый Структура( "Alpha, Green, Blue", 190, 255, 255), 5);
Ждать Компонента.DrawStringАсинх("Тест №8 рамка", ЗаписатьЗначениеJSON(Настройки));
ПоследнийСтатус = Ждать ОбновитьСтатус(Компонента);
//-------------------------------------------------------------------------
//9. поворот текста имитиреум вод. знак
Настройки = Новый Структура("Point, Text, Rotate", Новый Структура("X, Y", 50, -50), Новый Структура, 45);
Настройки.Text.Вставить("Color", Новый Структура("Alpha", 128));
Настройки.Text.Вставить("Font", Новый Структура("Size", 84));
Ждать Компонента.DrawStringАсинх("Тест №9 поворот", ЗаписатьЗначениеJSON(Настройки));
//-------------------------------------------------------------------------
//9. Прямоугольниr
Настройки = Новый Структура("Rect, Filling, Borders", Новый Структура, Новый Структура, Новый Структура);
Настройки.Rect = Новый Структура("X,Y,Width,Height", 0, ПоследнийСтатус.Data.Y + 100, 200, 100);
Настройки.Filling = Новый Структура("Color, LinearGradientColor"
, Новый Структура("Alpha, Blue", 255, 255), Новый Структура("Color, Point"
, Новый Структура("Alpha, Red", 100, 255), Новый Структура("X", 1)));
Настройки.Borders = Новый Структура("Color, Width", Новый Структура("Alpha", 150), 5);
Ждать Компонента.DrawShapeАсинх("Rect", ЗаписатьЗначениеJSON(Настройки));
ПоследнийСтатус = Ждать ОбновитьСтатус(Компонента);
//-------------------------------------------------------------------------
//9. Круг - элипс
Настройки.Rect = Новый Структура("X,Y,Width,Height", ПоследнийСтатус.Data.X + 250, ПоследнийСтатус.Data.Y, 100, 100);
Настройки.Filling.Color = Новый Структура("Alpha, Red", 255, 255);
Настройки.Filling.LinearGradientColor.Color = Новый Структура("Alpha, Green", 100, 255);
Настройки.Filling.LinearGradientColor.Вставить("Mode", "LinearGradientModeVertical");
Настройки.Удалить("Borders");
Ждать Компонента.DrawShapeАсинх("ellipse", ЗаписатьЗначениеJSON(Настройки));
ПоследнийСтатус = Ждать ОбновитьСтатус(Компонента);
//-------------------------------------------------------------------------
//9. Область круга
Настройки.Rect = Новый Структура("X,Y,Width,Height", ПоследнийСтатус.Data.X + 150, Настройки.Rect.Y, 100, 100);
Настройки.Вставить("Angle", Новый Структура("Start, Sweep", 0, 330));
Настройки.Filling.Удалить("LinearGradientColor");
Настройки.Filling.Color = Новый Структура("Alpha, Green", 255, 255);
Настройки.Вставить("Borders", Новый Структура("Color, Width", Новый Структура("Alpha", 255), 2));
Ждать Компонента.DrawShapeАсинх("Pie", ЗаписатьЗначениеJSON(Настройки));
ПоследнийСтатус = Ждать ОбновитьСтатус(Компонента);
//-------------------------------------------------------------------------
//9. многоугольник
X = ПоследнийСтатус.Data.X + ПоследнийСтатус.Data.Width + 1;
Y = Настройки.Rect.Y;
Настройки = Новый Структура("Filling", Новый Структура);
Настройки.Filling.Вставить("Color", Новый Структура("Alpha, Blue, Green", 255, 255, 255));
Точки = Новый Массив;
Точки.Добавить(Новый Структура("X, Y", X, Y));
Точки.Добавить(Новый Структура("X, Y", X + 200, Y - 20));
Точки.Добавить(Новый Структура("X, Y", X + 100, Y + 100));
Точки.Добавить(Новый Структура("X, Y", X + 120, Y + 120));
Точки.Добавить(Новый Структура("X, Y", X + 50, Y + 200));
Настройки.Вставить("Borders", Новый Структура("Color, Width", Новый Структура("Alpha, Red", 255, 155), 5));
Настройки.Вставить("Points", Точки);
Ждать Компонента.DrawShapeАсинх("Polygon", ЗаписатьЗначениеJSON(Настройки));
ПоследнийСтатус = Ждать ОбновитьСтатус(Компонента);
//-------------------------------------------------------------------------
//Вывели нашщи изменения на втарую картинку и уменьщели размер(вписали) чтобы влезла в форму орег размер 1080*1080
НастройкиСохранения = Новый Структура("Rect, Enter", Новый Структура("X,Y,Width,Height",0,0,700,700), Истина);
Ожидания = Ждать Компонента.SaveAsАсинх(, ЗаписатьЗначениеJSON(НастройкиСохранения));
ПоследнийСтатус = Ждать ОбновитьСтатус(Компонента);
КартинкаРезультат = ПоместитьВоВременноеХранилище(Новый Картинка(Ожидания.Значение), УникальныйИдентификатор);
//Востановили кортику до оригинала
Ждать Компонента.LoadImageАсинх(ДвоичныеДанныеОригинал);
//-------------------------------------------------------------------------
//Сохарнили маленкое изображение
НастройкиСохранения = Новый Структура("Format, Rect, Enter", "jpeg", Новый Структура("Width,Height",20,20), Истина);
Ожидания = Ждать Компонента.SaveAsАсинх(ДиректорияКартинок + "mini.jpeg", ЗаписатьЗначениеJSON(НастройкиСохранения));
Ждать Компонента.LoadImageАсинх(ДвоичныеДанныеОригинал);
//Образаем при сохранение
НастройкиСохранения = Новый Структура("Format, Rect, Enter", "png", Новый Структура("Width", 200), Ложь);
Ожидания = Ждать Компонента.SaveAsАсинх(ДиректорияКартинок + "Width.png", ЗаписатьЗначениеJSON(НастройкиСохранения));
Ждать Компонента.LoadImageАсинх(ДвоичныеДанныеОригинал);
//-------------------------------------------------------------------------
//Сохарнили изображение в 8 битцет описание EncoderParameters смотреть в MSDN
//до 8 бит удалось понизить только в тиф.
EncoderParameters = Новый Массив;
Параметр = Новый Структура("Guid, Type, Values", "66087055-ad66-4c7c-9a18-38a2310b8337", 4, Новый Массив);
Параметр.Values.Добавить(8);
EncoderParameters.Добавить(Параметр);
НастройкиСохранения = Новый Структура("Format, Rect, Enter, EncoderParameters"
, "tiff", Новый Структура("Width,Height", 200,200), Истина, EncoderParameters);
Ожидания = Ждать Компонента.SaveAsАсинх(ДиректорияКартинок + "mini2.tiff", ЗаписатьЗначениеJSON(НастройкиСохранения));
ПоследнийСтатус = Ждать ОбновитьСтатус(Компонента);
//Создаем битмап 200*200 для заголовка инфостарта
Ждать Компонента.CreateImageАсинх(200, 200);
Настройки = Новый Структура("Text, Filling, Rect", Новый Структура("Font, Alignment, Color, LinearGradientColor"
, Новый Структура("Size, Name, Style", 50, "Segoe Script", "FontStyleBold"), "StringAlignmentCenter", СоздатьЦветGDI(WebЦвета.Желтый)
, Новый Структура("Color, Mode", СоздатьЦветGDI(WebЦвета.Зеленый), "LinearGradientModeVertical"))
, Новый Структура("Color, LinearGradientColor", СоздатьЦветGDI(WebЦвета.Зеленый), Новый Структура("Color, Mode", СоздатьЦветGDI(WebЦвета.Желтый),"LinearGradientModeVertical"))
, Новый Структура("Width, Height", 200,200));
Ждать Компонента.DrawStringАсинх("1C " + Символы.ПС + "GDI+", ЗаписатьЗначениеJSON(Настройки));
ПоследнийСтатус = Ждать ОбновитьСтатус(Компонента);
НастройкиСохранения = Новый Структура("Format","png");
Ждать Компонента.SaveAsАсинх(ДиректорияКартинок + "gdic.png", ЗаписатьЗначениеJSON(НастройкиСохранения));
КонецПроцедуры
&НаКлиенте
Асинх Процедура Принскрин(Команда)
Компонента = Ждать СоздатьКомпоненту();
//Получим размеры текущего окна.
Ожидания = Ждать Компонента.GetWindowsSizeАсинх();
Размеры = ПрочитатьЗначениеJSON(Ожидания.Значение);
//Сделаем прискри текущего окна немного обрезав
НастройкиСохранения = Новый Структура("ForegroundWindow, x, y, width, height ", Истина
, 3, 80, Размеры.Foreground.width - 3 - 3, Размеры.Foreground.height -80 -20);
Ожидания = Ждать Компонента.CreatePrtScАсинх(ЗаписатьЗначениеJSON(НастройкиСохранения));
ПоследнийСтатус = Ждать ОбновитьСтатус(Компонента);
//Сохраним в jpeg и уменшим размер вписав скрин
НастройкиСохранения = Новый Структура("Format, Enter, Rect", "jpeg", Истина, Новый Структура("Width, Height"
, ПоследнийСтатус.Data.Width - 200, ПоследнийСтатус.Data.Height - 200));
Ожидания = Ждать Компонента.SaveAsАсинх(ДиректорияКартинок + "pts.jpeg", ЗаписатьЗначениеJSON(НастройкиСохранения));
КонецПроцедуры
&НаКлиенте
Функция СоздатьЦветGDI(Цвет1С = Неопределено, Прозрачность = 255)
Если Цвет1С = Неопределено Тогда
Возврат Новый Структура("Alpha, Red, Green, Blue", Прозрачность, 255, 255, 255);
КонецЕсли;
АбсЦв1С = Цвет1С.ПолучитьАбсолютный();
Возврат Новый Структура("Alpha, Red, Green, Blue", Прозрачность, АбсЦв1С.Красный, АбсЦв1С.Зеленый, АбсЦв1С.Синий);
КонецФункции
&НаКлиенте
Асинх Функция ОбновитьСтатус(Компонента)
Статус = Ждать Компонента.GetStatusАсинх();
ПоследнийСтатус = ПрочитатьЗначениеJSON(Статус.Значение);
Если ПоследнийСтатус.Code Тогда
//ПоследнийСтатус.Code <> 0 эта ошибка
ВызватьИсключение ПоследнийСтатус.Info + " >> " + ПоследнийСтатус.Error;
КонецЕсли;
Возврат ПоследнийСтатус;
КонецФункции
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ДиректорияКартинок = "C:\GDI_1C\TestImage\";
КонецПроцедуры