| Си и BMP файлы | 
|  | 
| 
| JSent | Дата: Пятница, 16 Мая 2014, 09:40 | Сообщение # 1 |  |   постоянный участник Сейчас нет на сайте | Стоит задача написать программу, которая создает bmp картинку (цветные геометрические фигуры). Причём написать именно на чистом Си. Но всё что я нагуглил было с использованием всяких классов и прочих особенностей С++. Тогда я решил работать с файлом, как с текстовым. Нашёл информацию о структуре bmp. Вроде что то понятно, решил посмотреть на примере. Открыл bmp файл в текстовом редакторе - сплошные каракули (так должно быть или беда с кодировкой?)
 Попробовал HEX редактор. Там те же каракули только ещё прилагается HEX-таблица, в которой тоже ничего непонятно. Причём увиденное мною никак не совпадает с тем о чём пишут в уроках о структуре BMP.
 
 На данный момент нашёл в файле только описание всех пикселей (на скриншоте "ХХХХХХХ").
 
 
 Что посоветуете? Как создать 8-битный bmp нужного размера, когда вся его структура описанная каким то мусором?
 
 Программист — человек, больной тяжёлой формой поражения коры головного мозга — интеллектом, который выражается в маниакально-деструктивном стремлении писать непонятные и бессмысленные наборы символов и словосочетаний.
 
 
 Сообщение отредактировал JSent - Пятница, 16 Мая 2014, 09:41 |  |  |  |  | 
| 
| falcoware | Дата: Пятница, 16 Мая 2014, 10:27 | Сообщение # 2 |  |   старожил Сейчас нет на сайте | JSent, нашелу себ немножко: 
 BOOL BMP_File::Save(char * fname)
 {
 
 BITMAPFILEHEADER	hdr;
 BITMAPINFOHEADER	bmi;
 
 int w = SizeX();
 int h = SizeY();
 
 memset(&hdr, 0, sizeof(BITMAPFILEHEADER));
 hdr.bfType = 0x4d42;
 hdr.bfOffBits = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER);
 int rb = (w * 3 + 3) & ~3;	// must be multiple of 4 bytes
 int lx = sizeof(BITMAPINFOHEADER) + (rb * h);
 hdr.bfSize = lx + sizeof(BITMAPFILEHEADER);
 
 Matr<BYTE> matr;
 matr.Set(rb, h); matr.ClearMemory();
 BYTE *cptr;
 
 // to dib
 
 int ix, jx, kx;
 
 for(kx = h - 1, jx = 0; jx < h; jx++, kx--){
 
 cptr = &matr.e(0, kx);
 
 for(ix = 0; ix < w; ix++){
 
 *cptr++ = Pixel(ix, jx).b;
 *cptr++ = Pixel(ix, jx).g;
 *cptr++ = Pixel(ix, jx).r;
 }
 }
 
 FILE *stream = fopen(fname, "wb"); if(!stream){ return FALSE; }
 
 fwrite(&hdr, 1, sizeof(BITMAPFILEHEADER), stream);
 
 memset(&bmi, 0, sizeof(BITMAPINFOHEADER));
 bmi.biSize = sizeof(BITMAPINFOHEADER);
 bmi.biWidth = w;
 bmi.biHeight = h;
 bmi.biPlanes = 1;
 bmi.biBitCount = 24;
 bmi.biCompression = BI_RGB;
 bmi.biSizeImage = matr.MemorySize();
 bmi.biXPelsPerMeter = 2834;
 bmi.biYPelsPerMeter = 2834;
 
 fwrite(&bmi, 1, sizeof(BITMAPINFOHEADER), stream);
 fwrite(matr.Memory(), 1, matr.MemorySize(), stream);
 fclose(stream);
 
 return TRUE;
 }
 |  |  |  |  | 
| 
| OpenGOO | Дата: Пятница, 16 Мая 2014, 10:38 | Сообщение # 3 |  |   почти ветеран Сейчас нет на сайте | Тебе надо создать двух мерный массив и заполнить его бинарными данными, в твоей терминологии мусором -) 
 Мои проекты:
 - Свободный и открытый клон World Of Goo
 - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
 
 [GameMaker: Studio v1.4.9999]
 
 
 Сообщение отредактировал OpenGOO - Пятница, 16 Мая 2014, 11:30 |  |  |  |  | 
| 
| JSent | Дата: Пятница, 16 Мая 2014, 10:51 | Сообщение # 4 |  |   постоянный участник Сейчас нет на сайте | OpenGOO, бинарными? А не шестнадцатеричными? 
 Программист — человек, больной тяжёлой формой поражения коры головного мозга — интеллектом, который выражается в маниакально-деструктивном стремлении писать непонятные и бессмысленные наборы символов и словосочетаний.
 |  |  |  |  | 
| 
| falcoware | Дата: Пятница, 16 Мая 2014, 11:53 | Сообщение # 5 |  |   старожил Сейчас нет на сайте | JSent, ну ты вообще потерянный! Какая разница между бинарным и шестнадцеричным? Очевидно, никакой. 
 Если битмап 8 речиный. То нужна палитра из 256 колоров и задавать номер палитры для рисования.
 |  |  |  |  | 
| 
| OpenGOO | Дата: Пятница, 16 Мая 2014, 12:51 | Сообщение # 6 |  |   почти ветеран Сейчас нет на сайте | Цитата JSent (  ) OpenGOO, бинарными? А не шестнадцатеричными?
 Ты путаешь тип данных с системой исчисления.
 
 Мои проекты:
 - Свободный и открытый клон World Of Goo
 - TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)
 
 [GameMaker: Studio v1.4.9999]
 |  |  |  |  | 
| 
| -l33t-h4xx- | Дата: Пятница, 16 Мая 2014, 13:03 | Сообщение # 7 |  |   участник Сейчас нет на сайте | Я не понял суть проблемы. На скриншоте изображена совершенно нормальная ситуация. Или ты, JSent, хотел увидеть нормальный ASCII-текст? Так такого не бывает. Что до формата, то посмотри в Википедии, сколько их там разных. И всё ВМР. Урок, который ты читал, мог описывать только один из них, а файл мог оказаться в другом.
 
 У меня есть книжка (на английском) про обработку изображений (в т.ч. ВМР) в С, могу дать почитать, если хочешь.
 
 Как правильно задавать вопросы
 |  |  |  |  | 
| 
| JSent | Дата: Четверг, 22 Мая 2014, 21:03 | Сообщение # 8 |  |   постоянный участник Сейчас нет на сайте | Жизнь идёт, проблемы остаются. Есть какая-нибудь нибудь функция в си, чтобы записать значение в конкретный байт файла (например в самый первый) ?
 
 Программист — человек, больной тяжёлой формой поражения коры головного мозга — интеллектом, который выражается в маниакально-деструктивном стремлении писать непонятные и бессмысленные наборы символов и словосочетаний.
 |  |  |  |  | 
| 
| falcoware | Дата: Четверг, 22 Мая 2014, 21:06 | Сообщение # 9 |  |   старожил Сейчас нет на сайте | JSent, fseek, fwrite! |  |  |  |  |