Страница 7 из 10

ZINT BarCode для Clarion

Добавлено: 12 Февраль 2020, 15:15
Игорь Столяров
Constantine писал(а): 12 Февраль 2020, 15:08 Я в соседней теме приводил правильную формулу расчета ширины строки...
Абсолютно верно ! И она же описана в FreeImage. И тут же Вы пишите:
Constantine писал(а): 12 Февраль 2020, 14:01 Возможно, это какая-то особенность FreeImage.
Когнитивный диссонанс, однако … :)

ZINT BarCode для Clarion

Добавлено: 12 Февраль 2020, 15:51
Constantine
Никакого диссонанса! :-)
Это означает, что FreeImage не умеет работать с 24-бит. Соответственно, перед использованием, нужно конвертировать 24 - 32.
Разве это не особенность? :-)

ZINT BarCode для Clarion

Добавлено: 12 Февраль 2020, 16:03
Игорь Столяров
Constantine писал(а): 12 Февраль 2020, 15:51 Это означает, что FreeImage не умеет работать с 24-бит
Не буду спорить, т.к. не знаю. Только факты:
- Глубина цвета пикселя указывается в InfoHeader.biBitCount = 24, InfoHeader.biClrUsed = 0 ! (по biBitCount)
- Но сам 24-битный bitmap перед записью в DIB нужно разбивать и растягивать по длине строки.
- Как-то так, иначе не работает. Совсем. :)

ZINT BarCode для Clarion

Добавлено: 12 Февраль 2020, 16:07
Constantine
Игорь Столяров писал(а): 12 Февраль 2020, 16:03 Но сам 24-битный bitmap перед записью в DIB нужно разбивать и растягивать по длине строки.
Возможно. Зависит от того, что с ним планируется делать дальше. Если показывать во FreeImage, то придется. А если через Clipboard вставлять в Paint - нет.

ZINT BarCode для Clarion

Добавлено: 12 Февраль 2020, 16:19
Игорь Столяров
Constantine писал(а): 12 Февраль 2020, 16:07 Зависит от того, что с ним планируется делать дальше.
За ClipBoard и Paint не скажу, но так формируется строка для записи в ?Image{Prop:ImageBits} или просто в файл формата BMP.

ZINT BarCode для Clarion

Добавлено: 12 Февраль 2020, 17:43
kreator
Ну вы даёте! Я так понял - "растягивание по длине строки" - это превращение 24 бита в 32?

ZINT BarCode для Clarion

Добавлено: 12 Февраль 2020, 18:46
Игорь Столяров
kreator писал(а): 12 Февраль 2020, 17:43 это превращение 24 бита в 32
К сожалению нет - это было бы просто и не весело. :) Посмотрите в ZintClass.BitmapToImage() - что бы не копать в недрах FreeImage.
Вообще графика, её форматы и т.д. - это один из самых древних компонентов ОС. И почти за 40 лет там столько всего наслоилось … ;)

ZINT BarCode для Clarion

Добавлено: 13 Февраль 2020, 8:13
Constantine
kreator писал(а): 12 Февраль 2020, 17:43 Я так понял - "растягивание по длине строки" - это превращение 24 бита в 32?
Да, верно. По сути своей, 32-битный bitmap с нулевым значением альфа-канала эквивалентен 24-битному.
Устроены они, правда, по-разному, но на экране будут выглядеть совершенно одинаково.

ZINT BarCode для Clarion

Добавлено: 13 Февраль 2020, 8:32
Constantine
Игорь Столяров писал(а): 12 Февраль 2020, 16:19 но так формируется строка для записи в ?Image{Prop:ImageBits} или просто в файл формата BMP.
Не думаю, что ?Image{Prop:ImageBits} не сможет показать правильно сформированный 24-битный bitmap. Да, если конвертировать 24 - 32 таким образом, как это предлагается здесь, результат будет тот же самый.
То же самое касается и файла: что вы туда запишете, то и получите. Запишете правильно сформированный 24-бит - его и получите; запишете правильно сформированный 32-бит - тоже его и получите.
Судя по всему, разработчики этого самого FreeImage решили не заморачиваться с нормальной поддержкой 24-бит и выкрутились вот таким образом...
Это, однако, совершенно не означает, что так нужно делать всегда.

ZINT BarCode для Clarion

Добавлено: 13 Февраль 2020, 8:59
Игорь Столяров
Constantine писал(а): 13 Февраль 2020, 8:32 Не думаю, что ?Image{Prop:ImageBits} не сможет показать правильно сформированный 24-битный bitmap
Я шёл по пути практики, а не гипотетических рассуждений о возможностях. А именно:
- Загрузил в строку 24 битный BMP файл сформированный ZINT и разобрал его структуру;
- Добавил метод, который формирует аналогичную строку на основании Bitmap ZINT и записывает её ?Image{Prop:ImageBits}.
- Всё. Вроде бы ничего лишнего или принятого за уши. :)

ZINT BarCode для Clarion

Добавлено: 13 Февраль 2020, 9:11
Constantine
Тогда в чем проблема?
Если есть программа (ZINT), которая корректно формирует 24-битный bitmap, и есть программа, которая его корректно показывает через ?Image{Prop:ImageBits}, зачем что-то куда-то конвертировать? Все должно работать и так...

ZINT BarCode для Clarion

Добавлено: 13 Февраль 2020, 9:43
Игорь Столяров
Constantine писал(а): 13 Февраль 2020, 9:11 Если есть программа (ZINT), которая корректно формирует 24-битный bitmap
К сожалению это не так. Библиотека ZINT корректно формирует 24-битный BMP ФАЙЛ (!!!) с картинкой штрих-кода.
А вот строку (массив байт) приходится формировать самостоятельно, на основании bitmap (карты памяти) ZINT.

Здесь просто расхождение терминологии. Вы пытаетесь любой набор данных картинки в памяти называть bitmap.

ZINT BarCode для Clarion

Добавлено: 13 Февраль 2020, 10:11
Constantine
Игорь Столяров писал(а): 13 Февраль 2020, 9:43 24-битный BMP ФАЙЛ (!!!) с картинкой штрих-кода
А что мешает считать bitmap прямо из файла в DIB-секцию?
Нужно только сместить указатель начала файла на SIZE(FILEINFOHEADER)+1. Если файл сформирован корректно (открывается на просмотр), все, что идет дальше, до конца файла, и есть то, что Вам нужно.
Какая разница, сколько там бит? Зачем что-то конвертировать?
Игорь Столяров писал(а): 13 Февраль 2020, 9:43 Здесь просто расхождение терминологии. Вы пытаетесь любой набор данных картинки в памяти называть bitmap.
Никакого расхождения нет. В данном случае, с точки зрения MSDN:
1. BITMAP = BITMAPINFOHEADER + пиксели. Если Вы его разместили в обычной памяти с помощью функции CreateCompatibleBitmap, то он и есть просто bitmap,
2. DIB = тот же самый BITMAP в DIB-секции, ее можно разместить как в обычной памяти, так и в контексте устройства (DC),
3. Файл *.BMP = BITMAPFILEHEADER + тот же самый BITMAP. Он может быть как в оперативной памяти (если Вы его там сформируете), так и на диске.

ZINT BarCode для Clarion

Добавлено: 13 Февраль 2020, 10:19
kreator
Constantine, я уже и то понял. Поскольку библиотека ZINT формирует 24-битную "карту" пикселей, с ней работать корректно не получается. Как её не назови, DIB, Bitmap. В любом случае её нужно превращать в 32-битную.

ZINT BarCode для Clarion

Добавлено: 13 Февраль 2020, 10:29
Constantine
kreator писал(а): 13 Февраль 2020, 10:19 с ней работать корректно не получается.
Почему?
Если файл корректно открывается на просмотр - все ОК.
Если файл штатным образом корректно вставить в Кларионовский Image, и он будет нормально отображаться - все ОК.