gifts2017

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

Опубликовал Pavel Fomin (Pasha1st) в раздел Программирование - Работа с интерфейсом

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примеры:

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

к=СоздатьКартинку(Новый Картинка ("C:\test.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(строка)

 


Минусы:

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

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

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

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Рисование картинки
.epf 35,37Kb
03.11.14
38
.epf 1.0 35,37Kb 38 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Allexey (alex_4x) 05.11.14 11:52
2. Pavel Fomin (Pasha1st) 03.01.15 00:14
На базе этой обработки сделал формирование штрихкодов без использования внешних компонент здесь
3. Андрей Максимов (гыук320) 02.10.15 21:21
Кто-нибудь встречал что-то наподобие на управляемых формах?
4. Pavel Fomin (Pasha1st) 03.10.15 00:12
(3) гыук320, Можно использовать и в управляемых формах.
Весь основной код находится в модуле объекта, функции экспортируются.
В режиме управляемой формы потребуется оформить процедуру формирования картинки на сервере.

&НаСервере
Функция ПолучитьМодульФормы()
	Возврат РеквизитФормыВЗначение("Объект");
КонецФункции

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

Ну и так далее. Более подробно можно посмотреть в обработке формирования штрихкодов http://infostart.ru/public/321943/
гыук320; +1 Ответить
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа