![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Slay1 |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.5.2006 Репутация: нет Всего: нет |
Сначала первьій ворос - не знаю как заполнить некоторьіе поля заголовка.
Значит огласил я 2 структурьі:
Но не знаю какие значения дать некоторьім полям(те, что закомментированьі):
//bitmap_header.file_size; - насколько я понимаю размер файла должен бьіть (getmaxx()*getmaxy())/2+54 ? Но на практике, размер файла, сделаного, например, в paint немножко больше.. //bitmap_header.offset; - смещение, я думал оно равно 54, но для примера открьіл файл и оно там 118. Не понимаю, так как оно вьічисляєтся? //bitmap_information.number_of_color_planes; - єтого вообще не понимаю //bitmap_information.image_size; - не понял в каком формате писать //bitmap_information.horizontal_pixels_per_meter; - как єто и следующие вьічислить тоже не понимаю //bitmap_information.vertical_pixels_per_meter; ^ //bitmap_information.colors_used; - тут и в следующем насколько я поняо должно бьіть 16, так? //bitmap_information.important_colors; Поскольку я не знал как заголовок оформить, но хотел попробовать сохранить в бмп, просто прочитал заголовок из файла с таким же расширением, и пробовал сохранять таким обращом:
Но получил просто бмп, весь залитьій черньім цветом... Программа остановливалась только ctrl+break на єтой строке - fputc(pixel,bitmap_file); Помогите пожалуйста. Это сообщение отредактировал(а) Slay1 - 4.6.2006, 15:17 |
||||||
|
|||||||
| ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 1 Всего: 14 |
bitmap_header.offset - смещение относительно начала файла до таблицы цветов, длина которой может изменяться от 8 до 1024 байт. Правда не все bmp имеют такую таблицу (например в 24 битных её нет).
bitmap_header.file_size - размер всего файла (заголовки, таблица цветов и сам массив). bitmap_information.number_of_color_planes = 1. bitmap_information.image_size - размер картинки в байтах. Оно равно width*height*bits_per_pixel/8. По-моему если bmp не сжата (compression=0), то здесь надо ставить 0, хотя я в этом не уверен. bitmap_information.colors_used - количество используемых цветов из таблицы. Этот параметр имеет значение только для сжатых картинок. Если color_used равен 0, то используется максимально возможное количество цветов (в твоём случае 16). bitmap_information.important_colors - количество важных цветов - число цветов, которые необходимы для того, чтобы изобразить рисунок. Если значение равно 0, то все цвета считаются важными. bitmap_information.horizontal_pixels_per_meter, bitmap_information.vertical_pixels_per_meter - горизонтальное и вертикальное разрешение устройства. Можешь задавать здесь свои значения. -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
| Slay1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.5.2006 Репутация: нет Всего: нет |
Как узнать размер файла? По логике ширина*висота+54, на на практике виходит где-то на 100-200 байт больше, тогда какая же окончательная формула расчета размера файла так и не могу понять... В 4 битных тоже нет, то есть смещение до таблици цветов 0?? Но я для примеру читал один 16-цветной бмп, там оффсет равен 118 |
|||
|
||||
| Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Вот код для записи заголовка для некомпрессированного bmp. Выдрано из программы с мясом, но, надеюсь, разобраться поможет. Объект Dib, который встречается в коде - это оболочка вокруг DIBSection.
Вычисление длины строки:
-------------------- ... |
||||
|
|||||
| ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 1 Всего: 14 |
Как это таблицы цветов нет в 4 битных bmp? Как же тогда кодируется массив, содержащий картинку? Таблицы цветов нет только в 24 битных (поскольку там используется RGB) и, по-моему, ещё в 16 битных.
Размер таблицы цветов равен 4*2^n для n-битного bmp (2^n - количество цветов). В твоём случае offset равен 54+4*2^4=118, что и было в файле. Примерный размер bmp файла равен 54+4*2^n+(width*height*n)/8, где width и height - размер картинки в пикселях (примерный поскольку размер таблицы цветов может быть разный). -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
| Slay1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.5.2006 Репутация: нет Всего: нет |
Ну никак не виходит разобраться. Вроде как все елементьі хедера заполнил нормально, но сохраняет просто черний екран, и потом файл в пейнте даже не хочет редактироваться...
Это сообщение отредактировал(а) Slay1 - 5.6.2006, 20:16 |
|||
|
||||
| ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 1 Всего: 14 |
А где таблица цветов? Если бы у тебя был 24 битный bmp, то такое решение вполне бы подошло. Но у тебя 4 битный bmp и тебе надо описать каждый используемый цвет. Потом в массиве каждый пиксель будет описываться одним байтом - ссылкой на место, где содержится описание этого цвета.
Вот кстати неплохой пример. Это сообщение отредактировал(а) ptr - 6.6.2006, 11:11 -------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
| ptr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 661 Регистрация: 31.5.2006 Где: Новосибирск Репутация: 1 Всего: 14 |
Кстати совсем забыл. В битовом массиве строки кодируются снизу вверх. Количество байт в строке должно быть кратно 4, поэтому если количество пикселей по горизонтали не кратно 4, то справа в каждую строчку дописываются выравнивающие нули.
-------------------- Единственный способ определить границы возможного - это выйти за эти границы, в невозможное. Артур Кларк. |
|||
|
||||
| Slay1 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.5.2006 Репутация: нет Всего: нет |
||||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |