Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Обработка bmp картинки


Автор: Mixus 17.3.2005, 10:38
Вопрос такой:
среда разработки Microsoft Visual Studio .NET
Visual C++ Win 32
Есть чёрно белая bmp картинка 100 на 100 пикселей, нарисовано несколько черных линий на белом фоне. Нужно получить матрицу 100 на 100 в которой пиксель черного цвета =1 а белого =0.
Спомощью каких функций это можно сделать?

Автор: chaos 17.3.2005, 14:40
ты можешь написать эту функцию сам!!!
Тебе нужно посмотреть организацию формата бмп
на сколько я помню там есть заголовок состоящий из 54 байт, далее в зависимости от бмп(8бит, 16бит, 24бит...) может идти таблица цветов(размер вроде 1К), а может и не идти, как уже сказал это зависит от картинки, а потом непосредственно сам рисунок
только там есть еще особенность, рисунок вроде как перевернут, точно не помню
в общем найди описание или эксперементируй

Автор: cardinal 17.3.2005, 15:49
Mixus, вот тебе структура bmp'шки:
Структура Bmp-файлаИмяДлинаСмещениеОписаниеЗаголовок файла (BitMapFileHeader)Type2 0Сигнатура "BM"Size4 2Размер файлаReserved 12 6ЗарезервированоReserved 22 8ЗарезервированоOffsetBits410Смещение изображения от начала файлаИнформационный заголовок (BitMapInfoHeader)Size414Длина заголовкаWidth418Ширина изображения, точкиHeight422Высота изображения, точкиPlanes226Число плоскостейBitCount228Глубина цвета, бит на точкуCompression430Тип компрессии (0 - несжатое изображение)SizeImage434Размер изображения, байтXpelsPerMeter438Горизонтальное разрешение, точки на метрYpelsPerMeter442Вертикальное разрешение, точки на метрColorsUsed446Число используемых цветов (0 - максимально возможное для данной глубины цвета)ColorsImportant450Число основных цветовТаблица цветов (палитра) (ColorTable)ColorTable102454256 элементов по 4 байтаДанные изображения (BitMap Array)ImageSize1078Изображение, записанное по строкам слева направо и снизу вверх
Подробнее читай здесь:
http://pascal.sources.ru/articles/099.htm
Самым лучшим другом в понимании структур файлов тебе будет Norton Commander smile
Если ты создашь файл x.bmp с косой чертой (из левого нижнего к правому верхнему углу ч/б картинки) размером 100х100 и переименуешь его в x в NC, то ты сможешь открыть этот файл в NC нажав F3. Нажава после этого F4 ты увидишь следующее:

Автор: cardinal 17.3.2005, 16:23
А теперь думай, что к чему. Картинка во-первых перевернута (начинается картинка в файле с нижнего левого угла, а кончается правым верхним)
Цитата
После таблицы цветов находятся данные изображения, которое по строкам растра записано снизу вверх, а внутри строки — слева направо.

, а во-вторых инвертирована. То есть 1 это белая точка, а 0 это черная.
Теперь ближе к делу. Сигнатуру 'BM' я думаю ты уже видишь. Теперь как пример объясню как узнать где же начинается картинка. Все что для этого надо знать это OffsetBits. То есть находим его (начало на 11 байте) и видим 3E 00 00 00, что в нормальном человеческом представлении означает 00 00 00 3E или просто 62. То есть начиная с 63 байта у нас идет картинка.
То есть начало такое (первая строка): 7F FF FF FF FF FF FF FF FF FF FF FF F0 00 00 00.
или в битиках: 01111111 11111111 ... 11110000 00000000 00000000 00000000.
Осталось только объяснить что за нули оказались в конце строки.
Цитата
Так как на некоторых платформах невозможно считать единицу данных, которая меньше 4 байт, длина каждой строки выровнена на границу в 4 байта, т. е. при длине строки, некратной четырем, она дополняется нулями. Это обстоятельство обязательно надо учитывать при считывании файла, хотя, возможно, лучше заранее позаботиться, чтобы горизонтальные размеры всех изображений были кратны 4.

Вот тебе и 16 байт на строку, хотя как бы и (100 + 7) / 8 = 13 достаточно.
Короче чтобы посчитать длину строки пользуйся формулой
длина строки = ((кол-во пикселей в строке + 7) / 8 + 3 ) / 4
Деление во всех формулах целочисленное.
Цитата(chaos @ 17.3.2005, 12:40)
далее в зависимости от бмп(8бит, 16бит, 24бит...)

В твоем случае это 1-bit картинка. Для других картинок кое-что из написанного надо делать иначе.

А еще почитай здесь:
http://forum.vingrad.ru/index.php?showtopic=23726&view=findpost&p=163261

Успехов!

Автор: Guest 21.3.2005, 10:40
Спасибо!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)