Форум программистов, компьютерный форум 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, 11:30     BITMAPINFOHEADER #2
Вы именно такой код запускаете? Тогда посмотрите внимательно на 10 строку (подсказка - посчитайте кавычки).

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

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

Не по теме:

ща msdn гляну...

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

Не по теме:

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

silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.12.2010, 21:37     BITMAPINFOHEADER #11
Да вы на словах скажите, возможно, что-то всплывёт в памяти... Давно я с этими функциями не работал...
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
01.12.2010, 21:42  [ТС]     BITMAPINFOHEADER #12
Цитата Сообщение от silent_1991 Посмотреть сообщение
[B]
Добавлено через 1 минуту
а вы уверены, что в памяти, о которой вы говорите "ничего нет", действительно ничего нет? На самом деле там всегда что-то есть, и это что-то программисты называют "мусор". Именно мусор у вас и выводится.
Если есть такая проблема, ждем от вас метода решения или хотя бы размышлений.
(я пока что не догадываюсь)
З. Ы. Давайте не будем ити на поводу у известного высказывания
Американский форум — задаешь вопрос тебе на него отвечают.
Израильский форум — задаешь вопрос тебе отвечают вопросом.
Наш форум — задаешь вопрос тебе объясняют какой ты [м*дак].
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.12.2010, 21:45     BITMAPINFOHEADER #13
Ха. Т.е. лучше бы вы ещё некоторое время считали, что "компилятор не может вывести число, которого нет", пока вам бы кто-нибудь другой не объяснил абсурдность этого заявления? Метод решения - инициализировать поле biSizeImage перед тем, как его выводить.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.12.2010, 21:46     BITMAPINFOHEADER #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;
}
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
01.12.2010, 21:49  [ТС]     BITMAPINFOHEADER #15
Тогда как правильно передать в структуру бмп файл, чтобы произошла инициализация всех его значений??
(Это не обвинение, я только учусь может быть чего то недопонимаю, просим объяснить)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.12.2010, 21:51     BITMAPINFOHEADER #16
Не буду спорить, но не уверен, что метод read класса ifstream совпадает с сишной функцией fread (если не так - поправьте). Да и на счёт fread - это было предположение, я точно не помню, что она делает в подобных случаях.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.12.2010, 21:57     BITMAPINFOHEADER #17
Он считывает блок данных, чтоб понять как инициализируются члены структуры, очевидно нужно знать формат BMP файла (может там внутри как раз эта инфа есть). Наверно так.

Добавлено через 1 минуту
не зря же в read для структуры сделано (char*)
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
01.12.2010, 21:57     BITMAPINFOHEADER #18
Ну вот я и говорю, что это всё только предположения. Но из исходника в топике темы следует, что недостающие поля структуры тупо не инициализируются.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
01.12.2010, 22:03     BITMAPINFOHEADER #19
может структура файла такова, что там первые байты идут по порядку "размер, ширина, высота и т.д.", приводя указатель к типу char тупо считываются байты и записываются по этому адресу. Ну и на нужное поле структуры попадает нужное значение. (может разработчики порядок полей написали именно под BMP файлы)
Это так, мысли в слух.
htonasral
5 / 5 / 1
Регистрация: 19.05.2009
Сообщений: 23
01.12.2010, 22:04  [ТС]     BITMAPINFOHEADER #20
Есть еще вариант считать с помощью fread в строку char*, потом с помощью memcpy скопировать в объект структуры данные со строки.
Но у меня выводило тоже самое.
Ждемс еще вариантов...
Yandex
Объявления
01.12.2010, 22:04     BITMAPINFOHEADER
Ответ Создать тему
Опции темы

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