Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.70
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
#1

BITMAPINFOHEADER - C++

01.12.2010, 04:58. Просмотров 3178. Ответов 24
Метки нет (Все метки)

Собственно нужно со структуры BITMAPINFOHEADER считать нужную информацию (например %.biSizeImage). Но при чтении этой переменной результат не очень то информативен.
Вообщем не будем отличаться от вопросов созданных в этой теме и спросим - "В чём собственно проблема?"
Рисунок test.bmp - это 24-разрядный bmp рисунок, размером 100х120 px, залитый чёрным цветом.

Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include "stdafx.h"
#include <windows.h>
#include <string.h>
 
 
 
int main(int argc, char* argv[])
{
    FILE *input=fopen("test".bmp", "rb");
    if(!input)
    {
        printf("Error opening file!!!\n");
        return 1;
    }
    long size;
    fseek(input, 0, SEEK_END);
    size=ftell(input);
    fseek(input, 0, SEEK_SET);
    
    BITMAPINFOHEADER bmp;
    
    fread(&bmp, sizeof(BITMAPINFOHEADER), size, input);
 
    printf("Size =%d\n", size);
    
    printf("Size(using BMPINFO) =%d\n", bmp.biSizeImage);
 
    return 0;
}
На выходе имеем:
Size =36054
Size(using BMPINFO) =-858993460

Почему же все-таки, используя структуру BITMAPINFOHEADER, выводится значение -858993460??
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.12.2010, 21:51 #16
Не буду спорить, но не уверен, что метод read класса ifstream совпадает с сишной функцией fread (если не так - поправьте). Да и на счёт fread - это было предположение, я точно не помню, что она делает в подобных случаях.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
01.12.2010, 21:57 #17
Он считывает блок данных, чтоб понять как инициализируются члены структуры, очевидно нужно знать формат BMP файла (может там внутри как раз эта инфа есть). Наверно так.

Добавлено через 1 минуту
не зря же в read для структуры сделано (char*)
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.12.2010, 21:57 #18
Ну вот я и говорю, что это всё только предположения. Но из исходника в топике темы следует, что недостающие поля структуры тупо не инициализируются.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
01.12.2010, 22:03 #19
может структура файла такова, что там первые байты идут по порядку "размер, ширина, высота и т.д.", приводя указатель к типу char тупо считываются байты и записываются по этому адресу. Ну и на нужное поле структуры попадает нужное значение. (может разработчики порядок полей написали именно под BMP файлы)
Это так, мысли в слух.
0
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
01.12.2010, 22:04  [ТС] #20
Есть еще вариант считать с помощью fread в строку char*, потом с помощью memcpy скопировать в объект структуры данные со строки.
Но у меня выводило тоже самое.
Ждемс еще вариантов...
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.12.2010, 22:05 #21
Да, я раньше уже понял, что вы об этом говорили))) Но ведь код в топике верный. А вывод на экран значения поля biSizeImage приводит к выводу мусора - значит это поле не инициализируется)))
Тоже мысли вслух)))
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
01.12.2010, 22:16 #22
Цитата Сообщение от silent_1991 Посмотреть сообщение
А вывод на экран значения поля biSizeImage приводит к выводу мусора - значит это поле не инициализируется)))
Тоже факт! Можно до считывания добавить строку
C++
1
cout<<bmp.biSizeImage;
Чтоб понять, меняется ли это поле после fread, если да, значит не правильно читаем.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.12.2010, 22:19 #23
Можно. Но лучше printf("%d", bmp.biSizeImage);

Не по теме:

Ну да, да, придираюсь)))

0
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
02.12.2010, 00:29  [ТС] #24
Вообщем с помощью структуры BITMAPFILEHEADER выяснилось что в fread нужно считывать не поток, а один байт:
C++
1
fread(&bmp, sizeof(BITMAPFILEHEADER), 1, input);
После чего элемент bmp.bfSize структуры BITMAPFILEHEADER показывает то что нужно.
Но используя таким методом BITMAPINFOHEADER переменная biSizeImage всё равно выводит не то что нужно, но и не то что раньше.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
02.12.2010, 09:58 #25
Цитата Сообщение от htonasral Посмотреть сообщение
Но используя таким методом BITMAPINFOHEADER переменная biSizeImage всё равно выводит не то что нужно, но и не то что раньше.
Похоже нельзя использовать структуру BITMAPINFOHEADER таким образом. Вот что я нарыл про формат BMP файлов:
BITMAPFILEHEADER

Эта структура описана в файле wingdi.h. Эта структура идет самой первой в файле BMP. Вот её описание.
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;

Первой переменной идет bfType - эта переменная содержит тип файла. В нормальном растре первыми буквами идет BM в виде ASCII или 4D42 в шестнадцатеричном виде.

Дальше bfSize должен содержать размер файла в байтах. Говорят, что это значение ненадежно и использовать его не стоит.

bfReserved1 & bfReserved2 зарезервированы и использовать их не нужно.

bfOffBits смещение в байтах от начала растра до массива данных. Этим можно пользоваться.
0
Yandex
Объявления
02.12.2010, 09:58
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru