Потребовалось мне как-то создавать штрихкоды без использования внешних компонент и шрифтов. Из этого получилась в итоге данная обработка. Попутно были решены следующие задачи:
* Кодирование данных (массив байт) в Base64-строку и обратно. Позволило проводить все операции в памяти.
* Написал функции для работы с двоичной арифметикой (почти полностью не пригодились )
* 1С8 использует для текста кодировку Unicode (UCS-2), сделал таблицу преобразования Unicode->Win1251
Уже после нашел подобную обработку , но моя мне нравится больше
Планирую выложить в ближайшее время формирование штрихкодов на базе этой обработки, и сделать аналогичную для векторного 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(строка)
Минусы:
Работает довольно медленно для больших изображений.
Не делал масштабирование
Не делал заливку произвольных областей