Свежие обсуждения
Компьютеры

Как устроен файл WBMP

1 4

Я тут обнаружил, что программа convert из пакета ImageMagick может из любого графического файла сделать WBMP, причём так называемый "dithering" осуществляется автоматически.
Хочу узнать структуру файла WBMP (ну помню, что в первых двух байтах содержится информация о размере рисунка, но в каком именно виде?). А также подскажите алгоритм преобразования десятичного числа от 0 до 255 в двоичное (формат-то однобитный).
Хочу чтобы станочек из http://pda.pro-radio.ru/it-works!/1498-10/ рисовал на разогнутых пивных банках не вектором, а растром! Так что вместо TurboCNC придётся что-то своё изобретать.

 

Num Lock: Хочу узнать структуру файла WBMP
Все, что могу посоветовать - google

Num Lock: рисовал на разогнутых пивных банках не вектором, а растром!
В смысле, поставить в соленоид плоттера иголку, и сделать одноигольчатый матричный принтер?

Num Lock: Так что вместо TurboCNC придётся что-то своё изобретать.
Зачем? Надо просто написать утилитку, делающую из битмапа G-код. Могу посоветовать Image-To-Gcode, когда пару лет назад использовал ее, 30-дневную версию давали нахаляву - для ознакомления с принципом можно попробовать. С уважением, Николай.

 

Такая утилитка у меня есть, причём линуховая и совсем фриварная. Называется bmp2cnc. Она берёт bmp однобитный и делает из него G-код. Но для настоящего трёхкоординатного станка. Чтобы переделать код на такой, у которого третья координата - соленоид, надо команды заменять в готовом файле потом. Лучше сделать некую прогу, чтобы брала wbmp и на его основе управляла движками непосредственно.
Иголки там не будет. Будет маленький движок с бором.
Ну ладно, Google про wbmp мало что выдаёт, но у меня где-то доки были. Теперь вопрос, как из десятичного числа двоичное сделать? Как из двоичного десятичное, я знаю, а как наоборот-то?

 

Что значит сделать? Перевести из одной системы счисления в другую? Если это, классический способ - деление на степени основания системы счисления. Проясните проблему

 

Задача очень проста. В файле wbmp одна точка представлена одним битом. Один байт олицетворяет восемь точек. Но программа на трубо паскале не может считывать файл побитно, только побайтно. Надо из очередного прочитанного байта вытащить каждый из его восьми битов.
Иными словами, на входе переменная типа byte, на выходе array [0..7] of boolean.

 

Самый простой алгоритм (прошу прощения, Pascal подзабыл - будет С++):

bool result[8]; // Здесь будет результат преобразования.
unsigned char temp, i; // Рабочие переменные.

for (i = 0, temp = ваш_преобразуемый_байт; i < sizeof(result)/sizeof(result[0]); i++, temp <<= 1)
result[i] = temp & 0x80 == 0x80;

Есть еще лукавый вариант - с применением union, но он сильно привязан к конкретной реализации языка, а, кроме того, немного дольше работает.

 

Спасибо. Будем думать, как это на паскаль перевести.

 

Так. Вытаскивалка отдельных битов из байта готова и правильно работает. Потом нашёл гуглом доки на wbmp. Программа, корректно вычисляющая размер картинки, также готова. Сейчас пишу смотрелку, надеюсь скоро выложить. А потом объединю её с программой управления ШД и также выложу.

 

Здравствуйте, товарищи! Вот вам, собственно, и программа WBMPVIEW. Я пытался написать такую программу ещё в 2001 году, тогда я пользовался турбо паскалем 7.0 (каюсь!). Но программа была заброшена именно потому что я не знал, как из байта отдельные биты вытаскивать.
Теперь же, в связи с появлением у меня этих обломков графопостроителя, программа была вытащена из небытия и доделана, на этот раз на антикварном турбо паскале 5.5, который добрый дядя Борланд раздаёт всем желающим (без права на перевыкладывание) на http://community.borland.com/museum.
В связи с использованием для ширины и высоты переменных типа byte программа показывает только файлы с разрешением не более 248 на 200. Я пробовал использовать для обозначения этих величин переменные типа integer, чтобы показывать файлы разрешением до 320 на 200, но оно начинало глючить (отрицательные числа поползли какие-то).
В турбо паскале 5.5 есть такой модуль Graph3, который работает с черепашьей графикой (как в языке Лого). Из более поздних версий его вроде бы убрали.
Если программа будет использоваться на медленной машине, надо откопать в тексте оператор delay(30); и уменьшить выдержку либо вообще его убрать.
Да, сама структура файла WBMP была откопана тута: http://www-128.ibm.com/ … bmp/?dwzone=wireless
Следующий этап - переделка WBMPVIEW в WBMPPLOT..

39615.pas

 

Хоть этот форум и не по программированию, но так немного лучше. А вообще с черепашьей графикой надо завязывать как и с древними компиляторами. Можно найти и посовременнее (и при желании даже freeware) .

39671.pas