Программное создание картинки
В статье приводится алгоритм программного создания однотонной картинки на основе переданного цвета.
- Описание
- Подробнее
Описание
Как-то мне понадобилось сделать однотонные цветные закладки, чтобы пользователь мог сам выбирать цвет. Стандартный функционал 1С страниц панели, поддерживает только присвоение объекта типа Картинка для закладок. Возможно, есть решение в объектах ActiveX, но моя душа к такому способу не лежала. Но как говорится, если гора идет к Магомету, то Магомет идет к горе. Поэтому решил создать объект типа Картинка программно.
Для этого идеально подошел формат BMP (как самый простейший из форматов хранения изображений). Чтобы не заморачиваться с палитрой, выбрал 24-битную глубину изображения (байты цвета каждого пикселя хранятся в порядке Blue,Green,Red). Затем, не мудрствуя лукаво, создал однотонную картинку 16×16 в паинте и вооружившись HEX-редактором перенес оттуда заполненные поля заголовка файла в код 1С, который заполняет массив данных. Чтобы записать массив в бинарный файл, запихиваем его в COMSafeArray, который уже с помощью потока COMОбъекта «ADODB.Stream» сохраняем в файл.
Таким образом, путем нехитрых манипуляций родилась небольшая функция:
Функция СоздатьКартинку(Цвет)
Данные = Новый Массив(822);
// Заполняем заголовок файла служебной информацией
Данные[0] = 66; Данные[1] = 77;
Данные[2] = 54; Данные[3] = 03;
Данные[10] = 54; Данные[14] = 40;
Данные[18] = 16; Данные[22] = 16;
Данные[26] = 01; Данные[28] = 24;
Данные[38] = 195; Данные[39] = 14;
Данные[42] = 195; Данные[43] = 14;
// Заполняем всю картинку выбранным цветом
// Единственный косяк в том, что нельзя выбрать ни WebЦвета, ни Windows
// Как вариант, можно выбрать цвет на вкладке WevЦвета или Windows, затем перейдя на вкладку «из стиля»
// поменять значение любого компонента цвета (красный, зеленый, синий) и вернуть его обратно
Для Счетчик = 0 По 255 Цикл
Данные[54 + Счетчик * 3] = Цвет.Синий;
Данные[54 + Счетчик * 3 + 1] = Цвет.Зеленый;
Данные[54 + Счетчик * 3 + 2] = Цвет.Красный;
КонецЦикла;
// Обводим рамочкой и не забываем, что строки в bmp-файле хранятся снизу-вверх
Для Счетчик = 0 По 15 Цикл
// рамка снизу
Данные[54 + Счетчик * 3] = 0; Данные[55 + Счетчик * 3] = 0; Данные[56 + Счетчик * 3] = 0;
// рамка сверху
Данные[773 + Счетчик * 3] = 0; Данные[774 + Счетчик * 3] = 0; Данные[775 + Счетчик * 3] = 0;
// рамка слева
Данные[54 + Счетчик * 48] = 0; Данные[55 + Счетчик * 48] = 0; Данные[56 + Счетчик * 48] = 0;
// рамка справа
Данные[ 99 + Счетчик * 48] = 0; Данные[100 + Счетчик * 48] = 0; Данные[101 + Счетчик * 48] = 0;
КонецЦикла;
// Создаем bmp-файл
ИмяФайла = ПолучитьИмяВременногоФайла(«bmp»);
Поток = Новый COMОбъект(«ADODB.Stream»);
Поток.Type = 1;
Поток.Mode = 3;
Поток.Open();
Поток.Write(Новый COMSafeArray(Данные, «VT_UI1», Данные.Количество()));
Поток.SaveToFile(ИмяФайла);
Поток.Close();
Возврат Новый Картинка(Новый ДвоичныеДанные(ИмяФайла));
КонецФункции
Вот и все. Только пришлось добавить рамочку вокруг рисунка для красоты 🙂
