Расскажите как устроен BMP-файл [вопрос по C++]

Yulka-MOl

Всем доброго времени суток,
Тема следующая:
Есть консольная программа, результат её работы - матрица чисел типа byte размера M x N.
Было бы очень удобно результат выводить в стандартный BMP файл.
Сделать это надо без использования классов MFC, потому что программа должна быть именно консольной.
Расскажите плз [дайте ссылку] как устроен простейший несжатый bmp файл в Windows и пару примеров на C++ если не трудно.
Заранее спасибо.

davidko

независимо от ОС, там идут по три байта на точку(RGB) c правого нижнего угла. Гуглить лень, по памяти со спецкурса Сухаревой говорю. Но, думаю, очень просто найтись должно

Bird_V

Например вот: http://pascal.sources.ru/articles/099.htm
Если будешь писать на С, не забудь #pragma pack 1 выставить, иначе не получиться

Yulka-MOl

клево, только жалко на C++ примеров нет

Yulka-MOl

спасибо

Flack_bfsp

Могу дать класс, который я писал три года назад на машграф.

oleg701

Стопудоф машграф у многих остался.
Я тож в bmp рендерил, но оно все не на работе ессно

Flack_bfsp

Клёво, я с котами разговариваю.
У меня всё тут осталось. Так что если что - обращайтесь.

Yulka-MOl

Расшарь если это возможно.
P.S. В принципе я почитал то, что выложил. По этому материалу я думаю смогу написать.
P.S. Главная загвоздка: я не понимаю как можно на этапе создания файла закладывать размер этого файла, сдвиги в байтах внутри этого файла и прочее.

oleg701

Если ты знаешь размер картинки, то размер файла вычисляется автоматом как [размер заголовка] + 3*[число пикселей]
З.Ы. А поскольку я довольно ленив, я в свое время не стал париться заполнением заголовка BMP, а взял заголовок существующего файла и прицеплял его ко всем своим картинкам, благо размер у всех картинок был один и тот же - 640х480.

danilov

там практически стандарт - вроде 54 на шапку, 4*кол-во цветов на палитру (если она нужна) и на растр с учётом того, что
24бита - это всё-таки 4 байта (один пустой) и длина строки (в байтах, а не пикселах) должна быть кратна 4-м (хотя может, этого уже не требуется
то есть если у тебя 1 байт на цвет то должно быть от 0 до 3-х пустых байт в конце каждой строки. если 2 - то 0 или 2. С кол-вом цветов < 256 не работал - ничего ен могу сказать.

danilov

[размер заголовка] + 3*[число пикселей] - вот по поводу этого я как раз не уверен.
раньше нужно было 4*[число пикселей].
Проверил - был не прав

Flack_bfsp

Эта формула верна только для полноцветных бмп-шек.

oleg701

Я так понимаю, что есть два различнных беспалитровых формата - в одном пиксел представляется тремя байтами, в другом - четырьмя. У меня, кажется, было именно 3, но точно не вспомню - слишком давно это было.

oleg701

Ну да. Они самые простые на мой взгляд, поэтому выгодно использовать именно их.
А уж как они архиваторами сжимаются

Marinavo_0507

Сделать это надо без использования классов MFC, потому что программа должна быть именно консольной.
А что, стандартные библиотеки не дают записать картинку в графический файл, не выводя её на экран?

Flack_bfsp

Это точно. Как-то пытался с 256-цветными возиться, было немного сложнее.
А что касается того, как узнать размер - вот кусок моего исходника:
 class RGBc
{
public:
unsigned char b, g, r;
...
};
...
struct BMPFILEHEADER bfh;
struct BMPINFOHEADER bih;
...
bfh.bfSize = Width * Height * sizeof(RGBc) + sizeof(bfh) + sizeof(bih);
...

Yulka-MOl

ну всё, работает

Werdna

Добрый вечер, вендузятнечег!
Если бы твой мозг не был заражен неизлечимо виндузятским стилем мышления, ты бы просто спросил, чем можно создавать bmp. Спросил бы без расплывчатых и несвязных рассуждений, без упоминания ни MFC (оно-то каким боком сюда?). Кстати, весьма показательно, что программа консольная — наверное, для вас это такой же удивительный факт как и розовый негр.
Итак, чем можно создавать bmp?
Ответ: bmp, впрочем как и gif/png/jpeg можно создавать библиотекой gd. Замечу, что она свободная, и даже под винду собрана. Вот ссылка:
http://www.boutell.com/gd/
Пользуйся на здроровье, познавай красивый мир открытого ПО.

aleks058

Жжжешь
2автор: как вариант можешь рассмотреть библиотеку CImg для обработки изображений. Сохранять bmp, в частности, она умеет. Представляет собой один файл cimg.h, который подключается к твоему проекту - и все. Кросс-платформенная и свободная, чего так жаждет .
Для сохранения картинки надо что-то вроде

using namespace cimg;
Image<unsigned char> img(width, height, 1, 3); // Трехцветная двумерная картинка заданных размеров
// Заполняешь картинку пикселами
cimg_mapXY(img, x, y)
{
img(x, y, 0, 0) = 255; // Красный
img(x, y, 0, 1) = 128; // Зелёный
img(x, y, 0, 2) = 0; // Синий
}
img.save("MyImage.bmp"); // Сохранить картинку. Тип определяется по расширению (bmp, gif, еще что-то)

evgen5555

Вы ещё ImageMagick посоветуйте, вдруг человек купится на пианистовский треш

Ivan8209

А зачем ImageMagick, если нужна gd?
---
...Я работаю антинаучным аферистом...

evgen5555

Оно _открытее_ вроде бы

Sebasten

Remember, gd is open source; we answer gd questions on a volunteer basis, as time permits. If your question is about Perl or PHP or another language, we don't necessarily know the answer (although we will be glad to find it for you on a paid-support basis)

Вот уроды

Yulka-MOl

Тема закрыта.
Оставить комментарий
Имя или ник:
Комментарий: