Си и 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!
|
|
| |