Расскажите как устроен BMP-файл [вопрос по C++]
![](/images/graemlins/smile.gif)
http://web.uccs.edu/wbahn/ECE1021/STATIC/REFERENCES/bmpfilef...
http://atlc.sourceforge.net/bmp.html
по-русски - http://jenyay.wallst.ru/index.php?id=bmp
http://atlc.sourceforge.net/bmp.html
по-русски - http://jenyay.wallst.ru/index.php?id=bmp
http://pascal.sources.ru/articles/099.htm
Если будешь писать на С, не забудь #pragma pack 1 выставить, иначе не получиться
Например вот: Если будешь писать на С, не забудь #pragma pack 1 выставить, иначе не получиться
клево, только жалко на C++ примеров нет
спасибо
Могу дать класс, который я писал три года назад на машграф.
Я тож в bmp рендерил, но оно все не на работе ессно
![](/images/graemlins/smile.gif)
![](/images/graemlins/grin.gif)
У меня всё тут осталось. Так что если что - обращайтесь.
P.S. В принципе я почитал то, что выложил. По этому материалу я думаю смогу написать.
P.S. Главная загвоздка: я не понимаю как можно на этапе создания файла закладывать размер этого файла, сдвиги в байтах внутри этого файла и прочее.
З.Ы. А поскольку я довольно ленив, я в свое время не стал париться заполнением заголовка BMP, а взял заголовок существующего файла и прицеплял его ко всем своим картинкам, благо размер у всех картинок был один и тот же - 640х480.
24бита - это всё-таки 4 байта (один пустой) и длина строки (в байтах, а не пикселах) должна быть кратна 4-м (хотя может, этого уже не требуется
то есть если у тебя 1 байт на цвет то должно быть от 0 до 3-х пустых байт в конце каждой строки. если 2 - то 0 или 2. С кол-вом цветов < 256 не работал - ничего ен могу сказать.
раньше нужно было 4*[число пикселей].
Проверил - был не прав
Эта формула верна только для полноцветных бмп-шек.
Я так понимаю, что есть два различнных беспалитровых формата - в одном пиксел представляется тремя байтами, в другом - четырьмя. У меня, кажется, было именно 3, но точно не вспомню - слишком давно это было.
А уж как они архиваторами сжимаются
![](/images/graemlins/grin.gif)
Сделать это надо без использования классов MFC, потому что программа должна быть именно консольной.А что, стандартные библиотеки не дают записать картинку в графический файл, не выводя её на экран?
![](/images/graemlins/ooo.gif)
А что касается того, как узнать размер - вот кусок моего исходника:
class RGBc
{
public:
unsigned char b, g, r;
...
};
...
struct BMPFILEHEADER bfh;
struct BMPINFOHEADER bih;
...
bfh.bfSize = Width * Height * sizeof(RGBc) + sizeof(bfh) + sizeof(bih);
...
ну всё, работает
Если бы твой мозг не был заражен неизлечимо виндузятским стилем мышления, ты бы просто спросил, чем можно создавать bmp. Спросил бы без расплывчатых и несвязных рассуждений, без упоминания ни MFC (оно-то каким боком сюда?). Кстати, весьма показательно, что программа консольная — наверное, для вас это такой же удивительный факт как и розовый негр.
Итак, чем можно создавать bmp?
Ответ: bmp, впрочем как и gif/png/jpeg можно создавать библиотекой gd. Замечу, что она свободная, и даже под винду собрана. Вот ссылка:
http://www.boutell.com/gd/
Пользуйся на здроровье, познавай красивый мир открытого ПО.
![](/images/icons/grin.gif)
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, еще что-то)
![](/images/graemlins/wink.gif)
---
...Я работаю антинаучным аферистом...
![](/images/graemlins/smile.gif)
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)
Вот уроды
![](/images/graemlins/smile.gif)
Тема закрыта.
Оставить комментарий
Yulka-MOl
Всем доброго времени суток,Тема следующая:
Есть консольная программа, результат её работы - матрица чисел типа byte размера M x N.
Было бы очень удобно результат выводить в стандартный BMP файл.
Сделать это надо без использования классов MFC, потому что программа должна быть именно консольной.
Расскажите плз [дайте ссылку] как устроен простейший несжатый bmp файл в Windows и пару примеров на C++ если не трудно.
Заранее спасибо.