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

ZINT BarCode для Clarion

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

ZINT BarCode для Clarion

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

ZINT BarCode для Clarion

Добавлено: 12 Февраль 2020, 9:45
kreator
Constantine писал(а): 12 Февраль 2020, 8:49 Ну вот определенно нравится вам лезть на кактус... :-)
ВСЕ графические устройства (мониторы, принтеры, дигитайзеры и пр.) понимают ИСКЛЮЧИТЕЛЬНО DIB (Device Independent Bitmap)!
Отлично! Объясните мне (может и народу тоже) как этот классный DIB связать с контролом IMAGE в Кларионе?

ZINT BarCode для Clarion

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

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

   ?Image{Prop:ImageBits} = DIB_ByteArray
Другой вопрос, где взять этот самый DIB, если есть только Bitmap ... ;)

ZINT BarCode для Clarion

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

ZINT BarCode для Clarion

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

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

?Image{Prop:ImageBits} = DIB_ByteArray

Другой вопрос, где взять этот самый DIB, если есть только Bitmap ...
Игорь, что такое DIB_ByteArray?

ZINT BarCode для Clarion

Добавлено: 12 Февраль 2020, 13:35
Игорь Столяров
kreator писал(а): 12 Февраль 2020, 13:13DIB_ByteArray
Некая бинарная последовательность, при записи которой в ?Image{Prop:ImageBits} будет показана картинка. :)
Вроде бы её формат должен быть DIB и в Win API она описывается как Byte Array.

ZINT BarCode для Clarion

Добавлено: 12 Февраль 2020, 13:38
kreator
У Constantine с точностью до наоборот. И я с ним согласен. Моя формула: Bitmap = DIB + Header.

ZINT BarCode для Clarion

Добавлено: 12 Февраль 2020, 13:39
Constantine
Кстати, Игорь, я не совсем понял, что имеется в виду под Bitmap?
Если файл *.BMP, то нужно действовать как я написал выше.
А если результат выполнения функции CreateCompatibleBitmap, то все еще проще: нужно просто создать DIB-секцию и скопировать в нее содержимое "Bitmap".

ZINT BarCode для Clarion

Добавлено: 12 Февраль 2020, 13:46
Constantine
kreator писал(а): 12 Февраль 2020, 13:38 Моя формула: Bitmap = DIB + Header
Не совсем так:
Если "Bitmap" создан при помощи функции CreateCompatibleBitmap, то содержимое "Bitmap" = DIB. Для того, чтобы его использовать в качестве DIB, его просто нужно поместить в DIB-секцию, чтобы Windows могла понять, что это.
Если же "Bitmap" создан из файла *.BMP, то тогда он начинается с заголовка BITMAPFILEHEADER, соответственно, все, что идет со смещением SIZE(BITMAPFILEHEADER)+1 = DIB. Его тоже нужно считать в DIB-секцию.

ZINT BarCode для Clarion

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

И вот эту строку BMP мы можем записать в ?Image

ZINT BarCode для Clarion

Добавлено: 12 Февраль 2020, 14:01
Constantine
Игорь Столяров писал(а): 12 Февраль 2020, 13:56 Но ! Bitmap должен быть расширен по строкам
Возможно, это какая-то особенность FreeImage. У Windows такой особенности нет: все необходимое для отображения есть в BITMAPINFOHEADER.
Игорь Столяров писал(а): 12 Февраль 2020, 13:56 + (опционально палитры)
Это только для 256-color. Информация об этом тоже есть в BITMAPINFOHEADER.

ZINT BarCode для Clarion

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

ZINT BarCode для Clarion

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

ZINT BarCode для Clarion

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