Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка bmp картинки 
:(
    Опции темы
Mixus
Дата 17.3.2005, 10:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вопрос такой:
среда разработки Microsoft Visual Studio .NET
Visual C++ Win 32
Есть чёрно белая bmp картинка 100 на 100 пикселей, нарисовано несколько черных линий на белом фоне. Нужно получить матрицу 100 на 100 в которой пиксель черного цвета =1 а белого =0.
Спомощью каких функций это можно сделать?
  Вверх
chaos
Дата 17.3.2005, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



ты можешь написать эту функцию сам!!!
Тебе нужно посмотреть организацию формата бмп
на сколько я помню там есть заголовок состоящий из 54 байт, далее в зависимости от бмп(8бит, 16бит, 24бит...) может идти таблица цветов(размер вроде 1К), а может и не идти, как уже сказал это зависит от картинки, а потом непосредственно сам рисунок
только там есть еще особенность, рисунок вроде как перевернут, точно не помню
в общем найди описание или эксперементируй
PM WWW   Вверх
cardinal
Дата 17.3.2005, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



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 ты увидишь следующее:

Присоединённый файл ( Кол-во скачиваний: 35 )
Присоединённый файл  bmp.gif


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
cardinal
Дата 17.3.2005, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 2
Всего: 99



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

, а во-вторых инвертирована. То есть 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?showtopi...ndpost&p=163261

Успехов!


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Guest
Дата 21.3.2005, 10:40 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо!!!
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0439 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.