Вторник, 26 Ноября 2024, 15:40

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Си и 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!
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг