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

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

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

BITMAPINFOHEADER - C++

01.12.2010, 04:58. Просмотров 3209. Ответов 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
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.12.2010, 11:30 #2
Вы именно такой код запускаете? Тогда посмотрите внимательно на 10 строку (подсказка - посчитайте кавычки).

Добавлено через 1 минуту
Хотя нет, при таком варианте это наверное даже не скомпилируется...
0
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
01.12.2010, 19:06  [ТС] #3
Цитата Сообщение от silent_1991 Посмотреть сообщение
Вы именно такой код запускаете? Тогда посмотрите внимательно на 10 строку (подсказка - посчитайте кавычки).
Да, это опечатка.
Вот код нормальный:
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;
}
Проблема остается открытой!!!
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.12.2010, 21:12 #4
Я не знаю, как выглядит эта структура, но вы нигде не инициализируете поле biSizeImage, а само оно инициализироваться не может.
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,274
Записей в блоге: 2
Завершенные тесты: 1
01.12.2010, 21:15 #5
Цитата Сообщение от silent_1991 Посмотреть сообщение
а само оно инициализироваться не может.
возможно здесь:
C++
1
fread(&bmp, sizeof(BITMAPINFOHEADER), size, input);
0
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
01.12.2010, 21:21  [ТС] #6
Цитата Сообщение от silent_1991 Посмотреть сообщение
Я не знаю, как выглядит эта структура, но вы нигде не инициализируете поле biSizeImage, а само оно инициализироваться не может.
Ну вообщето компилятор не может вывести число которого нету, так почему же у меня выводит.
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.12.2010, 21:22 #7
Kastaneda, эмм... Здесь будет считано size объектов размером sizeof(BITMAPINFOHEADER) каждый из потока input и запосано в bmp. Инициализации поля всё равно не вижу.

Добавлено через 1 минуту
htonasral, а вы уверены, что в памяти, о которой вы говорите "ничего нет", действительно ничего нет? На самом деле там всегда что-то есть, и это что-то программисты называют "мусор". Именно мусор у вас и выводится.
0
Kastaneda
01.12.2010, 21:26
  #8

Не по теме:

ща msdn гляну...

0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.12.2010, 21:30 #9
Возможно, я не очень помню, как работает fread, но чтобы она сама инициализировала недостающие поля, если ей передают указатель на структуру...
0
Kastaneda
01.12.2010, 21:36
  #10

Не по теме:

то то и оно, что не все так просто. Если сишный пример найду, выложу, пока только на делфи нашел.

0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.12.2010, 21:37 #11
Да вы на словах скажите, возможно, что-то всплывёт в памяти... Давно я с этими функциями не работал...
0
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
01.12.2010, 21:42  [ТС] #12
Цитата Сообщение от silent_1991 Посмотреть сообщение
[B]
Добавлено через 1 минуту
а вы уверены, что в памяти, о которой вы говорите "ничего нет", действительно ничего нет? На самом деле там всегда что-то есть, и это что-то программисты называют "мусор". Именно мусор у вас и выводится.
Если есть такая проблема, ждем от вас метода решения или хотя бы размышлений.
(я пока что не догадываюсь)
З. Ы. Давайте не будем ити на поводу у известного высказывания
Американский форум — задаешь вопрос тебе на него отвечают.
Израильский форум — задаешь вопрос тебе отвечают вопросом.
Наш форум — задаешь вопрос тебе объясняют какой ты [м*дак].
0
silent_1991
Эксперт С++
4984 / 3041 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
01.12.2010, 21:45 #13
Ха. Т.е. лучше бы вы ещё некоторое время считали, что "компилятор не может вывести число, которого нет", пока вам бы кто-нибудь другой не объяснил абсурдность этого заявления? Метод решения - инициализировать поле biSizeImage перед тем, как его выводить.
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,274
Записей в блоге: 2
Завершенные тесты: 1
01.12.2010, 21:46 #14
Вот на С++, человек утверждает, что это рабочий код, думаю в качестве примера вполне пойдет:
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class TEXTURE_BMP
{
  BITMAPFILEHEADER bitmapfileheader; // загоовок растрового файла
  BITMAPINFOHEADER bitmapinfoheader; // все данные о файле
  unsigned char *buffer;         // указатель на данные
  public:
    bool LoadBMP32(char *filename);
    bool FlipBMP();
    bool ReleaseBMP();
};
 
 
//А вот реализация метода для загрузки
bool TEXTURE_BMP::LoadBMP32(char *filename)
{
  ifstream load(filename, ios::in | ios::binary);
  if(!load)
    return false;
  load.read((char*) &bitmapfileheader, sizeof(BITMAPFILEHEADER));
 
  // проверка битмап ли этот файл
  if(bitmapfileheader.bfType != BITMAP_ID)
  {
    load.close();
    return false;
  }
  load.read((char*) &bitmapinfoheader, sizeof(BITMAPINFOHEADER));
 
  // проверка на сжатость
  if(bitmapinfoheader.biCompression != BI_RGB)
  {
    MessageBox(global_hwnd, "Сжатый гад!", "Ошибка!", NULL);
    load.close();
    return false;
  }
 
  // проверка глубины цвета
  if(bitmapinfoheader.biBitCount != 32)
  {
    MessageBox(global_hwnd, "Бит каунт блин!", "Ошибка!", NULL);
    load.close();
    return false;
  }
  if(buffer)
    delete buffer;
  buffer = new unsigned char [bitmapinfoheader.biSizeImage];
  load.read((char*) buffer, bitmapinfoheader.biSizeImage); 
 
  load.close();
  FlipBMP();
  return true;
}
0
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
01.12.2010, 21:49  [ТС] #15
Тогда как правильно передать в структуру бмп файл, чтобы произошла инициализация всех его значений??
(Это не обвинение, я только учусь может быть чего то недопонимаю, просим объяснить)
0
Yandex
Объявления
01.12.2010, 21:49
Ответ Создать тему
Опции темы

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