Создание рисунка BMP средствами 1С8 без использования компонент


Набор методов для создания растрового рисунка без использования внешних компонент и без использования файлов.
Возможности:
* Создание рисунка с цветностью 1,4,8 или 24 бит на пиксель.
* Для 1-8 битных цветов возможно управлять палитрой.
* Можно импортировать рисунок из объекта "Картинка", содержащий любое растровое изображение.
* Сохранение картинки в "Двоичные данные"
* Рисование примитив — линия, окружность (с заливкой или без), прямоугольник (с заливкой или без)
* Копирование фрагментов изображения
* Примитивный вывод текста

Потребовалось мне как-то создавать штрихкоды без использования внешних компонент и шрифтов. Из этого получилась в итоге данная обработка. Попутно были решены следующие задачи:

* Кодирование данных (массив байт) в Base64-строку и обратно. Позволило проводить все операции в памяти.

* Написал функции для работы с двоичной арифметикой (почти полностью не пригодились Wink)

* 1С8 использует для текста кодировку Unicode (UCS-2), сделал таблицу преобразования Unicode->Win1251

Уже после нашел подобную обработку , но моя мне нравится больше Wink

Планирую выложить в ближайшее время формирование штрихкодов на базе этой обработки, и сделать аналогичную для векторного WMF/EMF формата.

Для работы требуется создать структуру функциями СоздатьКартинку() или СоздатьКартинкуИзКартинки()
Все методы для работы с изображениями принимают первым параметром эту структуру.
В структуре есть свойства:

  • Параметры — структура с описанием характеристик изображения, свойства Высота, Ширина, БитНаПиксель, ЦветФона. Создание изображения требует именно эту структуру параметром.
  • Палитра — массив объектов Цвет. Если БитНаПиксель=24, создается пустой массив
  • Данные массив массивов-строк, содержащих данные о цветах пикселей.

Координаты считаются слева направо (0..Ширина-1) и сверху вниз (0..Высота-1)

Для вывода текста используется «шрифт» — картинка с изображениями символов, расположенных в сетке 16×16, в кодировке ANSI (Win1251). В обработку вшил готовые шрифты 6×8, 10×16, 14×24, 16×32 как макеты типа «двоичные данные» «font»+8/16/24/32 — по высоте символа в пикселях. Возможно добавить свой шрифт, назвав как «font»+идентификатор.

Цвет, если явно не оговорено другое (например что используется встроенный объект Цвет) — число, номер в палитре для 1-8-битных изображений и упакованное RGB 24-разрядное целое.

Предлагаются следующие методы:

* Конструкторы

Функция СоздатьКартинку(Параметры)

Функция СоздатьКартинкуИзКартинки(картинка)

Возвращают инициализированный объект.

Примеры:

к=СоздатьКартинку(Новый Структура(«Ширина,Высота,БитНаПиксель,ЦветФона»,150,60,4,12)); //150×60, 4 бит, залить цветом 12

к=СоздатьКартинку(Новый Картинка («C: est.jpg»));

* Сохранение

//Сохранить подготовленную картинку в файл формата BMP
Процедура СохранитьКартинкуВФайл(картинка,ИмяФайла)

//Сохранить подготовленную картинку в ДвоичныеДанные
Функция СохранитьКартинкуВДанные(картинка)

* Рисование

//Изменяет глубину цветности для картинки
Процедура КартинкаИзменитьБитность(картинка,НовыйБитНаПиксель)

//Изменяет глубину цветности для картинки, работает более быстро но менее точно. Преобразование 24->8 практически не отличается от стандартного варианта
Процедура КартинкаИзменитьБитностьБыстро(картинка,НовыйБитНаПиксель)

//Установить значение пикселя по координатам
Процедура КартинкаУстановитьПиксель(картинка,столбец,ряд,цвет)

//Получить значение пикселя
Функция КартинкаПолучитьПиксель(картинка,столбец,ряд)

//Получить цвет пикселя как объект Цвет()
Функция КартинкаПолучитьЦветПикселя(картинка,столбец,ряд)

//Рисование линии с произвольными координатами от (столбец1,ряд1) до (столбец2,ряд2)
Процедура КартинкаЛиния(картинка,столбец1,ряд1,столбец2,ряд2,цвет)

//Рисование окружности с указанным центром и радиусом. Если указан ЦветФона происходит заливка
Процедура КартинкаОкружность(картинка,столбец,ряд,радиус,цвет,ЦветФона=неопределено)

//Перенос фрагмента одной картинки в другую. Цвета не пересчитываются, т.е. картинки должны быть совместимы по палитрам или быть 24-бит. Ширина и Высота фрагмента — по умолчанию весь размер источника
Процедура КартинкаКопироватьУчасток(картинка,КартинкаИсточник,Столбец,Ряд,СтолбецИсточника=0,РядИсточника=0,Ширина=0,Высота=0)

//Рисование прямоугольника. Если указан ЦветФона происходит заливка
Процедура КартинкаПрямоугольник(картинка,столбец1,ряд1,столбец2,ряд2,ЦветГраницы,ЦветФона=Неопределено)

//Вывести указанный текст в указанные координаты
Процедура КартинкаВывестиТекст(картинка,столбец,строка,текст,шрифт)

* Служебные

//Преобразование объекта Цвет в число. Пример: цвет=ПолучитьЦвет24(Новый Цвет(10,60,255));
Функция ПолучитьЦвет24(цв)

//Обратное для ПолучитьЦвет24 преобразование — из числа в объект Цвет()
Функция Число24ВЦвет(цв)

//Получает шрифт (ч/б картинку) заданного размера. Поддерживаются размеры 8,16,24,32 — ширина и высота в пикселях. Можно указать используемый цвет фона (по умолчанию 1) и цвет текста (по умолчанию 0)
Функция ПолучитьШрифт(размер,ЦветТекста=Неопределено,ЦветФона=Неопределено)

* Прочие

// Получение кода символа в кодировке Win-1251
 Функция КодСимволаANSI(симв)

//Битовый сдвиг влево на число бит
Функция ДвВлево(ч,сдвиг)

//Битовый сдвиг вправо на число бит
Функция ДвВправо(ч,сдвиг)

//Битовое НЕ для указанного числа младших бит
Функция ДвНЕ(ч,ширина)

//Двоичное И двух чисел
Функция ДвИ(ч1,ч2)

//Двоичное ИЛИ двух чисел
Функция ДвИЛИ(ч1,ч2)

//Возвращает строку — кодированные по Base64 данные, представленные массивом байт. На входе массив байт
Функция КодироватьБ64(данные)

//Возвращает массив чисел — байт, декодированных из Base64 строки
Функция ДекодироватьБ64(строка)

 


Минусы:

Работает довольно медленно для больших изображений.

Не делал масштабирование

Не делал заливку произвольных областей

6 Comments

  1. alex_4x

    Даешь DOOM на языке 1С ! 🙂

    Reply
  2. Pasha1st

    На базе этой обработки сделал формирование штрихкодов без использования внешних компонент здесь

    Reply
  3. гыук320

    Кто-нибудь встречал что-то наподобие на управляемых формах?

    Reply
  4. Pasha1st

    (3) гыук320, Можно использовать и в управляемых формах.

    Весь основной код находится в модуле объекта, функции экспортируются.

    В режиме управляемой формы потребуется оформить процедуру формирования картинки на сервере.

    &НаСервере
    Функция ПолучитьМодульФормы()
    Возврат РеквизитФормыВЗначение(«Объект»);
    КонецФункции
    
    &НаСервере
    Функция СформироватьТестЛистНаСервере()
    Обработка=ПолучитьМодульФормы();
    к=Обработка.СоздатьКартинку(Новый Структура(«Высота,Ширина»,10,10));
    …
    

    Показать

    Ну и так далее. Более подробно можно посмотреть в обработке формирования штрихкодов http://infostart.ru/public/321943/

    Reply
  5. seacat

    Интересно, но 4500 печаль

    Reply
  6. vladnet

    К сожалению работает очень долго. Хорошо бы переработать на новые функции 1с.

    Reply

Leave a Comment

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