Класс для API ZINT «Barcode Generator»
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Игорь Столяров
- Ветеран движения
- Сообщения: 7948
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 92 раза
Класс для API ZINT «Barcode Generator»
Библиотека для создания практически любых штрих-кодов.
В примере показан вывод штрих-кодов в окно и отчёт.
(Перекрестная ссылка на альтернативу viewtopic.php?p=40124#p40124) добавил Admin
В примере показан вывод штрих-кодов в окно и отчёт.
(Перекрестная ссылка на альтернативу viewtopic.php?p=40124#p40124) добавил Admin
- Вложения
-
- zint-2025-04-20.zip
- Версия: 20.04.2025 г.
- (509.49 КБ) 280 скачиваний
Последний раз редактировалось Игорь Столяров 20 Апрель 2025, 19:40, всего редактировалось 16 раз.
Make Clarion Great Again ! 
- Игорь Столяров
- Ветеран движения
- Сообщения: 7948
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 92 раза
ZINT BarCode для Clarion
Абсолютно верно ! И она же описана в FreeImage. И тут же Вы пишите:Constantine писал(а): 12 Февраль 2020, 15:08 Я в соседней теме приводил правильную формулу расчета ширины строки...
Когнитивный диссонанс, однако …

Make Clarion Great Again ! 
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
ZINT BarCode для Clarion
Никакого диссонанса! 
Это означает, что FreeImage не умеет работать с 24-бит. Соответственно, перед использованием, нужно конвертировать 24 - 32.
Разве это не особенность?

Это означает, что FreeImage не умеет работать с 24-бит. Соответственно, перед использованием, нужно конвертировать 24 - 32.
Разве это не особенность?

- Игорь Столяров
- Ветеран движения
- Сообщения: 7948
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 92 раза
ZINT BarCode для Clarion
Не буду спорить, т.к. не знаю. Только факты:
- Глубина цвета пикселя указывается в InfoHeader.biBitCount = 24, InfoHeader.biClrUsed = 0 ! (по biBitCount)
- Но сам 24-битный bitmap перед записью в DIB нужно разбивать и растягивать по длине строки.
- Как-то так, иначе не работает. Совсем.

Make Clarion Great Again ! 
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
ZINT BarCode для Clarion
Возможно. Зависит от того, что с ним планируется делать дальше. Если показывать во FreeImage, то придется. А если через Clipboard вставлять в Paint - нет.Игорь Столяров писал(а): 12 Февраль 2020, 16:03 Но сам 24-битный bitmap перед записью в DIB нужно разбивать и растягивать по длине строки.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7948
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 92 раза
ZINT BarCode для Clarion
За ClipBoard и Paint не скажу, но так формируется строка для записи в ?Image{Prop:ImageBits} или просто в файл формата BMP.
Make Clarion Great Again ! 
-
- ✯ Ветеран ✯
- Сообщения: 5143
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 25 раз
ZINT BarCode для Clarion
Ну вы даёте! Я так понял - "растягивание по длине строки" - это превращение 24 бита в 32?
We are hard at work… for you. 

- Игорь Столяров
- Ветеран движения
- Сообщения: 7948
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 92 раза
ZINT BarCode для Clarion
К сожалению нет - это было бы просто и не весело.

Вообще графика, её форматы и т.д. - это один из самых древних компонентов ОС. И почти за 40 лет там столько всего наслоилось …

Make Clarion Great Again ! 
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
ZINT BarCode для Clarion
Да, верно. По сути своей, 32-битный bitmap с нулевым значением альфа-канала эквивалентен 24-битному.kreator писал(а): 12 Февраль 2020, 17:43 Я так понял - "растягивание по длине строки" - это превращение 24 бита в 32?
Устроены они, правда, по-разному, но на экране будут выглядеть совершенно одинаково.
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
ZINT BarCode для Clarion
Не думаю, что ?Image{Prop:ImageBits} не сможет показать правильно сформированный 24-битный bitmap. Да, если конвертировать 24 - 32 таким образом, как это предлагается здесь, результат будет тот же самый.Игорь Столяров писал(а): 12 Февраль 2020, 16:19 но так формируется строка для записи в ?Image{Prop:ImageBits} или просто в файл формата BMP.
То же самое касается и файла: что вы туда запишете, то и получите. Запишете правильно сформированный 24-бит - его и получите; запишете правильно сформированный 32-бит - тоже его и получите.
Судя по всему, разработчики этого самого FreeImage решили не заморачиваться с нормальной поддержкой 24-бит и выкрутились вот таким образом...
Это, однако, совершенно не означает, что так нужно делать всегда.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7948
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 92 раза
ZINT BarCode для Clarion
Я шёл по пути практики, а не гипотетических рассуждений о возможностях. А именно:Constantine писал(а): 13 Февраль 2020, 8:32 Не думаю, что ?Image{Prop:ImageBits} не сможет показать правильно сформированный 24-битный bitmap
- Загрузил в строку 24 битный BMP файл сформированный ZINT и разобрал его структуру;
- Добавил метод, который формирует аналогичную строку на основании Bitmap ZINT и записывает её ?Image{Prop:ImageBits}.
- Всё. Вроде бы ничего лишнего или принятого за уши.

Make Clarion Great Again ! 
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
ZINT BarCode для Clarion
Тогда в чем проблема?
Если есть программа (ZINT), которая корректно формирует 24-битный bitmap, и есть программа, которая его корректно показывает через ?Image{Prop:ImageBits}, зачем что-то куда-то конвертировать? Все должно работать и так...
Если есть программа (ZINT), которая корректно формирует 24-битный bitmap, и есть программа, которая его корректно показывает через ?Image{Prop:ImageBits}, зачем что-то куда-то конвертировать? Все должно работать и так...
- Игорь Столяров
- Ветеран движения
- Сообщения: 7948
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 28 раз
- Поблагодарили: 92 раза
ZINT BarCode для Clarion
К сожалению это не так. Библиотека ZINT корректно формирует 24-битный BMP ФАЙЛ (!!!) с картинкой штрих-кода.Constantine писал(а): 13 Февраль 2020, 9:11 Если есть программа (ZINT), которая корректно формирует 24-битный bitmap
А вот строку (массив байт) приходится формировать самостоятельно, на основании bitmap (карты памяти) ZINT.
Здесь просто расхождение терминологии. Вы пытаетесь любой набор данных картинки в памяти называть bitmap.
Make Clarion Great Again ! 
-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
ZINT BarCode для Clarion
А что мешает считать bitmap прямо из файла в DIB-секцию?
Нужно только сместить указатель начала файла на SIZE(FILEINFOHEADER)+1. Если файл сформирован корректно (открывается на просмотр), все, что идет дальше, до конца файла, и есть то, что Вам нужно.
Какая разница, сколько там бит? Зачем что-то конвертировать?
Никакого расхождения нет. В данном случае, с точки зрения MSDN:Игорь Столяров писал(а): 13 Февраль 2020, 9:43 Здесь просто расхождение терминологии. Вы пытаетесь любой набор данных картинки в памяти называть bitmap.
1. BITMAP = BITMAPINFOHEADER + пиксели. Если Вы его разместили в обычной памяти с помощью функции CreateCompatibleBitmap, то он и есть просто bitmap,
2. DIB = тот же самый BITMAP в DIB-секции, ее можно разместить как в обычной памяти, так и в контексте устройства (DC),
3. Файл *.BMP = BITMAPFILEHEADER + тот же самый BITMAP. Он может быть как в оперативной памяти (если Вы его там сформируете), так и на диске.
-
- ✯ Ветеран ✯
- Сообщения: 5143
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 25 раз
ZINT BarCode для Clarion
Constantine, я уже и то понял. Поскольку библиотека ZINT формирует 24-битную "карту" пикселей, с ней работать корректно не получается. Как её не назови, DIB, Bitmap. В любом случае её нужно превращать в 32-битную.
We are hard at work… for you. 

-
- Активист
- Сообщения: 185
- Зарегистрирован: 07 Февраль 2017, 16:58
ZINT BarCode для Clarion
Почему?
Если файл корректно открывается на просмотр - все ОК.
Если файл штатным образом корректно вставить в Кларионовский Image, и он будет нормально отображаться - все ОК.