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

BITMAPINFOHEADER - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.70
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
01.12.2010, 04:58     BITMAPINFOHEADER #1
Собственно нужно со структуры 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??
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.12.2010, 22:05     BITMAPINFOHEADER #21
Да, я раньше уже понял, что вы об этом говорили))) Но ведь код в топике верный. А вывод на экран значения поля biSizeImage приводит к выводу мусора - значит это поле не инициализируется)))
Тоже мысли вслух)))
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.12.2010, 22:16     BITMAPINFOHEADER #22
Цитата Сообщение от silent_1991 Посмотреть сообщение
А вывод на экран значения поля biSizeImage приводит к выводу мусора - значит это поле не инициализируется)))
Тоже факт! Можно до считывания добавить строку
C++
1
cout<<bmp.biSizeImage;
Чтоб понять, меняется ли это поле после fread, если да, значит не правильно читаем.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.12.2010, 22:19     BITMAPINFOHEADER #23
Можно. Но лучше printf("%d", bmp.biSizeImage);

Не по теме:

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

htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
02.12.2010, 00:29  [ТС]     BITMAPINFOHEADER #24
Вообщем с помощью структуры BITMAPFILEHEADER выяснилось что в fread нужно считывать не поток, а один байт:
C++
1
fread(&bmp, sizeof(BITMAPFILEHEADER), 1, input);
После чего элемент bmp.bfSize структуры BITMAPFILEHEADER показывает то что нужно.
Но используя таким методом BITMAPINFOHEADER переменная biSizeImage всё равно выводит не то что нужно, но и не то что раньше.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
02.12.2010, 09:58     BITMAPINFOHEADER #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 смещение в байтах от начала растра до массива данных. Этим можно пользоваться.
Yandex
Объявления
02.12.2010, 09:58     BITMAPINFOHEADER
Ответ Создать тему
Опции темы

Текущее время: 21:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru