ZINT BarCode для Clarion

Программы на Clarion, шаблоны, библиотеки и пр.

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7326
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ZINT BarCode для Clarion

Сообщение Игорь Столяров »

RaFaeL писал(а): 11 Февраль 2020, 17:38по идее
Так вот и я о том же … :) Но смущает, что в примере речь идёт не о строке с загруженным файлом,
а о массиве байт, что больше похоже на традиционный DIB/BMP … Пока не попробуешь - не узнаешь. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

ZINT BarCode для Clarion

Сообщение Constantine »

Ну вот определенно нравится вам лезть на кактус... :-)
ВСЕ графические устройства (мониторы, принтеры, дигитайзеры и пр.) понимают ИСКЛЮЧИТЕЛЬНО DIB (Device Independent Bitmap)!
Все остальное - *.BMP, *.GIF, *.PNG, *.WMF и т.п., - это ФОРМАТЫ ФАЙЛОВ. Прежде чем вы их увидите на экране или напечатаете на принтере, их нужно преобразовать в DIB.
Как правило, этим занимаются соответствующие приложения: графические редакторы, драйверы принтеров и т.п.
Некоторые форматы, например, *.BMP, *.PNG, *.WMF, *.EMF, поддерживаются непосредственно Windows API. Если есть желание - можете посмотреть в MSDN. Желание гарантированно исчезнет... :-)
Удачи в борьбе!
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

ZINT BarCode для Clarion

Сообщение kreator »

Constantine писал(а): 12 Февраль 2020, 8:49 Ну вот определенно нравится вам лезть на кактус... :-)
ВСЕ графические устройства (мониторы, принтеры, дигитайзеры и пр.) понимают ИСКЛЮЧИТЕЛЬНО DIB (Device Independent Bitmap)!
Отлично! Объясните мне (может и народу тоже) как этот классный DIB связать с контролом IMAGE в Кларионе?
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7326
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ZINT BarCode для Clarion

Сообщение Игорь Столяров »

kreator писал(а): 12 Февраль 2020, 9:45 DIB связать с контролом IMAGE в Кларионе
Это как раз-таки просто делается:

Код: Выделить всё

   ?Image{Prop:ImageBits} = DIB_ByteArray
Другой вопрос, где взять этот самый DIB, если есть только Bitmap ... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

ZINT BarCode для Clarion

Сообщение Constantine »

Игорь Столяров писал(а): 12 Февраль 2020, 9:51 Другой вопрос, где взять этот самый DIB, если есть только Bitmap
Ну, это совсем просто:
1. Загрузить файл *.BMP в память. Если памяти мало, считать с диска с соответствующим смещением.
2. Отрезать BITMAPFILEHEADER.
3. Создать DIB-секцию.
4. С помощью функций API типа BitBlt скопировать в нее получившийся результат.
5. Вуаля!
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

ZINT BarCode для Clarion

Сообщение kreator »

Меня вы запутали. Хорошо, если сами не путаетесь. По моему опыту ?Image{Prop:ImageBits} возвращает картинку с заголовком. Также работает и обратное присваивание.
Игорь Столяров писал(а): 12 Февраль 2020, 9:51 Это как раз-таки просто делается:

Код: Выделить всё

?Image{Prop:ImageBits} = DIB_ByteArray

Другой вопрос, где взять этот самый DIB, если есть только Bitmap ...
Игорь, что такое DIB_ByteArray?
We are hard at work… for you. :)
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7326
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ZINT BarCode для Clarion

Сообщение Игорь Столяров »

kreator писал(а): 12 Февраль 2020, 13:13DIB_ByteArray
Некая бинарная последовательность, при записи которой в ?Image{Prop:ImageBits} будет показана картинка. :)
Вроде бы её формат должен быть DIB и в Win API она описывается как Byte Array.
За теми кто отстал - не возвращаться. (С) Кодекс
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

ZINT BarCode для Clarion

Сообщение kreator »

У Constantine с точностью до наоборот. И я с ним согласен. Моя формула: Bitmap = DIB + Header.
We are hard at work… for you. :)
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

ZINT BarCode для Clarion

Сообщение Constantine »

Кстати, Игорь, я не совсем понял, что имеется в виду под Bitmap?
Если файл *.BMP, то нужно действовать как я написал выше.
А если результат выполнения функции CreateCompatibleBitmap, то все еще проще: нужно просто создать DIB-секцию и скопировать в нее содержимое "Bitmap".
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

ZINT BarCode для Clarion

Сообщение Constantine »

kreator писал(а): 12 Февраль 2020, 13:38 Моя формула: Bitmap = DIB + Header
Не совсем так:
Если "Bitmap" создан при помощи функции CreateCompatibleBitmap, то содержимое "Bitmap" = DIB. Для того, чтобы его использовать в качестве DIB, его просто нужно поместить в DIB-секцию, чтобы Windows могла понять, что это.
Если же "Bitmap" создан из файла *.BMP, то тогда он начинается с заголовка BITMAPFILEHEADER, соответственно, все, что идет со смещением SIZE(BITMAPFILEHEADER)+1 = DIB. Его тоже нужно считать в DIB-секцию.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7326
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ZINT BarCode для Clarion

Сообщение Игорь Столяров »

kreator писал(а): 12 Февраль 2020, 13:38 Моя формула: Bitmap = DIB + Header.
Тоже так думал, но у Microsoft другая точка зрения … :)
BMP (ФАЙЛ) = FileHeader + InfoHeader + (опционально палитры) + собственно BitMap.
Но ! Bitmap должен быть расширен по строкам - см. FreeImage или метод ZintClass.BitmapToImage()

И вот эту строку BMP мы можем записать в ?Image
За теми кто отстал - не возвращаться. (С) Кодекс
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

ZINT BarCode для Clarion

Сообщение Constantine »

Игорь Столяров писал(а): 12 Февраль 2020, 13:56 Но ! Bitmap должен быть расширен по строкам
Возможно, это какая-то особенность FreeImage. У Windows такой особенности нет: все необходимое для отображения есть в BITMAPINFOHEADER.
Игорь Столяров писал(а): 12 Февраль 2020, 13:56 + (опционально палитры)
Это только для 256-color. Информация об этом тоже есть в BITMAPINFOHEADER.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7326
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

ZINT BarCode для Clarion

Сообщение Игорь Столяров »

Понятно, что вся информация о рисунке есть BITMAPINFOHEADER - это его назначение.
Вопрос в другом, пардон, заблуждении.
Constantine писал(а): 12 Февраль 2020, 14:01 У Windows такой особенности нет
Пусть у нас есть bitmap картинки 30 x 40 пикселей, по три байта на пиксел (RGB) - т.е. т.н. 24-битная глубина цвета.
Так вот, если мы запишем заголовок + эту последовательность длиной 30 * 40 * 3 byte в ?Image - то ничего не получится.
Я даже Вам больше скажу: совсем-совсем ничего не получится, абсолютно ! :) Так а мы вроде бы в Windows работаем … ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

ZINT BarCode для Clarion

Сообщение Constantine »

Игорь Столяров писал(а): 12 Февраль 2020, 14:59 совсем-совсем ничего не получится, абсолютно
Гм... Странно... А у меня почему-то работает... :-)
Скриншот окна 32-bit в HDC -> конвертация 32-bit DIB - 24-bit DIB -> создание и сохранение 24-bit *.BMP...
Constantine
Активист
Сообщения: 185
Зарегистрирован: 07 Февраль 2017, 16:58

ZINT BarCode для Clarion

Сообщение Constantine »

Игорь Столяров писал(а): 12 Февраль 2020, 14:59 эту последовательность длиной 30 * 40 * 3 byte
Я в соседней теме приводил правильную формулу расчета ширины строки...
Ответить