| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Сохранение 4-битних bmp |
| Автор: Slay1 4.6.2006, 15:16 | ||||||
| Сначала первьій ворос - не знаю как заполнить некоторьіе поля заголовка. Значит огласил я 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); Помогите пожалуйста. |
| Автор: ptr 5.6.2006, 08:36 |
| 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 - горизонтальное и вертикальное разрешение устройства. Можешь задавать здесь свои значения. |
| Автор: Earnest 5.6.2006, 10:47 | ||||
Вот код для записи заголовка для некомпрессированного bmp. Выдрано из программы с мясом, но, надеюсь, разобраться поможет. Объект Dib, который встречается в коде - это оболочка вокруг DIBSection.
Вычисление длины строки:
|
| Автор: ptr 5.6.2006, 11:25 |
| Как это таблицы цветов нет в 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 5.6.2006, 20:15 | ||
Ну никак не виходит разобраться. Вроде как все елементьі хедера заполнил нормально, но сохраняет просто черний екран, и потом файл в пейнте даже не хочет редактироваться...
|
| Автор: ptr 6.6.2006, 11:05 |
| А где таблица цветов? Если бы у тебя был 24 битный bmp, то такое решение вполне бы подошло. Но у тебя 4 битный bmp и тебе надо описать каждый используемый цвет. Потом в массиве каждый пиксель будет описываться одним байтом - ссылкой на место, где содержится описание этого цвета. http://stephen.homeunix.org/Tech/programs/bmp.c |
| Автор: ptr 6.6.2006, 15:09 |
| Кстати совсем забыл. В битовом массиве строки кодируются снизу вверх. Количество байт в строке должно быть кратно 4, поэтому если количество пикселей по горизонтали не кратно 4, то справа в каждую строчку дописываются выравнивающие нули. |
| Автор: Slay1 6.6.2006, 17:05 |
Большое, огромное, жирное спасибо! Все, разобрался. |