| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Звук, графика и видео > побитовое чтение bmp файла |
| Автор: Mayday007 19.4.2009, 21:23 | ||
| Здравствуйте, прошу помочь со считованием моно bmp картинки на канву напрямую с файлом, с 24 битным изображением затруднений не возникло, представляю код на делфи, как реализовать вывод на канву однобитного файла и какова структурная разница между ними? Я понял только то, что в отличии от 24 б изображения, моно картинка читается по байту на цвет, а не триплексом, и еще: почему абсолютное смещение в моно картинке 62, а не 54 как в 24 б изобр.
|
| Автор: Alexeis 19.4.2009, 21:31 |
| Почитайте тут подробнее, может станет понятнее http://forum.vingrad.ru/topic-94227.html |
| Автор: Mayday007 19.4.2009, 21:52 |
| Я наверное тупой, но так и не понял структуру моно битмапа, как доступиться к самим цветам??? Заранее спасибо. |
| Автор: Alexeis 19.4.2009, 22:10 |
| 1 пиксель 1 бит, в одном байте 8 пикселей. Старший бит в байте крайне левый пиксель, младший крайне правый. Если часть бит не использовано в последнем байте строки, то они могут иметь произвольные значения. Число байт в строке должно быть кратно четырем, если реально получилось не так то дополнительно добавляется от одного до 3х байт, так чтобы полученная длинна была кратна 4м. Цвет пиксела определяется индексом в палитре, которая идет сразу за инфохередом и содержит 2е записи. |
| Автор: Mayday007 19.4.2009, 22:17 |
| Но почему смещение до начала изображения, если судить по файлу 62, а в 24 битном изображ. - смещение 54, что за разница в этих 8 битах??? Палитра.... а еще??? |
| Автор: Alexeis 19.4.2009, 23:17 |
| Палитра это 4 байта на цвет. Монохром 2 цвета, итого 4 * 2 = 8 байт. Палитра всегда идет за инфохедером 54 + 8 байт палитры = 62 Добавлено через 22 секунды 24 битном изображении нет палитры, поэтому нет смещения на 8 байт Добавлено через 3 минуты и 16 секунд P.S. Mayday007 это случаем не вы? http://www.apelsinforum.ru/index.php?showuser=43 |
| Автор: Mayday007 19.4.2009, 23:32 |
| Нет, это не я.))) и еще если не сложно последний вопрос, как кодируеться сама информация опосля 62 байт??? Вот данные после 62 бит(hex): C0 37 E9 01 C0 00 00 00 00 39 E9 01 00 00 00 00 Палитра 00 00 00 00 FF FF FF 00. Как же расшифровать-то данные? |
| Автор: Alexeis 19.4.2009, 23:44 |
| Если очередной бит нулевой то пиксель нужно рисовать первым цветом, т.е. (0, 0, 0), если 1, то вторым (255, 255, 255) |
| Автор: Mayday007 20.4.2009, 21:18 |
| Допустим вот наш файл: 42 42 00 00 00 00 00 00 00 3E 00 00 00 28 00 00 00 04 00 00 00 01 00 00 00 01 00 01 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 02 00 00 00 00 00 00 00 FF FF FF 00 50 69 EA 01 Это моно картинка высотой в 1 пикс, и шириной в четыре. 1 пикс-черный, 2-белый, 3-черный, 4 - белый. Эти 4 пиксела описывают 50 69 EA 01, 1пикс - 50, 2- 69, 3 - ЕА, 4 -01. т.е черный цвет это и 50 и ЕА ??? Почему??? не пойму((((( |
| Автор: Alexeis 20.4.2009, 21:35 |
| Mayday007, вы путаете биты и байты. 1й байт "50" содержит в себе все 4 пиксела. 50 в десятичной системе равно 1010000 в двоичной. 1010 - это 4 пиксела 0000 это дополняют биты до байта 69 EA 01 - 3 байта дополняющие строку до кратности 4м. Так как у нас только 1 рабочий байт, то чтобы дополнить до 4х байт добавляем еще 3. Значение 3х дополнительных байтов может быть произвольным. На практике так и вышло. Там просто мусор. |
| Автор: Mayday007 20.4.2009, 21:40 |
| огромное спасибо, все вышло.)))) |
| Автор: Mayday007 22.4.2009, 21:33 |
| И последний вопрос наш файл: 42 4D 46 00 00 00 00 00 00 00 3E 00 00 00 28 00 00 00 05 00 00 00 02 00 00 00 01 00 01 00 00 00 00 00 08 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 02 00 00 00 00 00 00 00 FF FF FF 00 88 F5 EB 01 20 73 EB 01 Это моно картинка высотой в 2 пикс, и шириной в 5. [1,1]pix-черный [1,2]pix-черный [1,3]pix-белый [1,4]pix-черный [1,5]pix-черный [2,1]pix-белый [2,2]pix-черный [2,3]pix-черный [2,4]pix-черный [2,5]pix-белый 10 пикселей - 88 F5 EB 01 20 73 EB 01, 88=10001000, уже с нашей картинкой не сходиться. Как тут быть??? |
| Автор: Alexeis 22.4.2009, 21:45 |
| Строки в битмапе идут слева направо, снизу вверх, а не сверху вниз как в обычной матрице. так что 1я строка сверху это число 20 = 0010 0000 |
| Автор: Mayday007 22.4.2009, 21:52 |
| 1) Почему мы взяли именно пятый байт? 2) 0010 0000 - первая строка 00100, а на вторую переноситься 000? |
| Автор: Mayday007 22.4.2009, 22:58 |
| а примера процедурки такой случаем нет??? просто сдача уже в пятницу, 24 бита и 8 бит сделал, а 1 бит нет, у меня учитель строгий(((( Могу выслать проект на делфи. |
| Автор: Alexeis 23.4.2009, 00:51 |
| Mayday007, там в статье есть примеры работы с разными битмапами в частности преобразование из беспалитрового в формат с палитрой 2/16/256 цветов |
| Автор: Mayday007 23.4.2009, 01:26 |
| А процедурку написать не поможете??? Я на вебмани денежку кину, если нужно, плизз.... оч нада |