Возможности:
* Создание рисунка с цветностью 1,4,8 или 24 бит на пиксель.
* Для 1-8 битных цветов возможно управлять палитрой.
* Можно импортировать рисунок из объекта "Картинка", содержащий любое растровое изображение.
* Сохранение картинки в "Двоичные данные"
* Рисование примитив — линия, окружность (с заливкой или без), прямоугольник (с заливкой или без)
* Копирование фрагментов изображения
* Примитивный вывод текста
Потребовалось мне как-то создавать штрихкоды без использования внешних компонент и шрифтов. Из этого получилась в итоге данная обработка. Попутно были решены следующие задачи:
* Кодирование данных (массив байт) в Base64-строку и обратно. Позволило проводить все операции в памяти.
* Написал функции для работы с двоичной арифметикой (почти полностью не пригодились )
* 1С8 использует для текста кодировку Unicode (UCS-2), сделал таблицу преобразования Unicode->Win1251
Уже после нашел подобную обработку , но моя мне нравится больше
Планирую выложить в ближайшее время формирование штрихкодов на базе этой обработки, и сделать аналогичную для векторного 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(строка)
Минусы:
Работает довольно медленно для больших изображений.
Не делал масштабирование
Не делал заливку произвольных областей
Даешь DOOM на языке 1С ! 🙂
На базе этой обработки сделал формирование штрихкодов без использования внешних компонентздесь
Кто-нибудь встречал что-то наподобие на управляемых формах?
(3) гыук320, Можно использовать и в управляемых формах.
Весь основной код находится в модуле объекта, функции экспортируются.
В режиме управляемой формы потребуется оформить процедуру формирования картинки на сервере.
Показать
Ну и так далее. Более подробно можно посмотреть в обработке формирования штрихкодовhttp://infostart.ru/public/321943/
Интересно, но 4500 печаль
К сожалению работает очень долго. Хорошо бы переработать на новые функции 1с.