Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как прочитать заголовок BMP 
:(
    Опции темы
BCworm
Дата 13.1.2010, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 23.8.2007

Репутация: нет
Всего: нет



Привет всем.

Пожалуйста помогите. Мне необходимо взять BMP файл и прочитать информацию содержащуюся в заголовке т.е в bmpheader. В сети нашел много исходников на С но большинство с форумов  содержат много ошибок.

PM MAIL   Вверх
chaos
Дата 13.1.2010, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 1
Всего: 44



BCworm, BMP
PM WWW   Вверх
BCworm
Дата 13.1.2010, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 23.8.2007

Репутация: нет
Всего: нет



Ну это везеде есть и на разных языках а вот как в билдере это прочитать? т.е как считать заголовок и подставить значения в переменные?
PM MAIL   Вверх
586
Дата 13.1.2010, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Код
#include <stdio.h>

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    BITMAPFILEHEADER bfh;
    BITMAPINFOHEADER bih;

    FILE *f = fopen("C:\\test.bmp", "rb");
    if(!f)
    {
        ShowMessage("Cannot open file.");
        return;
    }

    if(fread(&bfh, 1, sizeof(bfh), f) == sizeof(bfh) &&
        fread(&bih, 1, sizeof(bih), f) == sizeof(bih))
    {
        // обработка структур и чтение других данных из .bmp файла
    }
    else
    {
        ShowMessage("Error. Invalid file.");
    }
    fclose(f);
}

PM   Вверх
artsb
Дата 13.1.2010, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Прикрепляю пример.
Правда, вот такая штука:
Код

 BITMAPFILEHEADER bfh;
 // ...
 fs = new TFileStream(OpenDialog1->FileName, fmOpenRead | fmShareDenyWrite);

 if(fs->Read(&bfh, sizeof(BITMAPFILEHEADER))) {
  Memo1->Lines->Add("BitmapSize: " + IntToStr(bfh.bfSize));
  Memo1->Lines->Add("Offset: " + IntToStr(bfh.bfOffBits));
 }

не покатила... (получается полная ерунда) Сделал чтение поэлементно.

И кстати, вот это:
Код

sizeof(BITMAPFILEHEADER)

возвращает 16  smile 
По идее же 14 байт размер структуры...

Добавлено через 4 минуты и 58 секунд
586, вот это:
Код

    BITMAPFILEHEADER bfh;
    FILE *f = fopen("C:\\111.bmp", "rb");
    if(!f)
    {
        ShowMessage("Cannot open file.");
        return;
    }
    if(fread(&bfh, 1, sizeof(bfh), f) == sizeof(bfh))
    {
     Memo1->Lines->Add(bfh.bfSize);
     Memo1->Lines->Add(bfh.bfOffBits);
    }
    else
    {
        ShowMessage("Error. Invalid file.");
    }
    fclose(f);

тоже ерунду заносит в Мемо.

Это сообщение отредактировал(а) artsb - 13.1.2010, 13:50

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  bmp.rar 15,61 Kb


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
smoke_man
Дата 13.1.2010, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань

Репутация: 9
Всего: 17



Можно просто объявить структуры без выравнивания:
Код

#pragma pack(push, 1)
typedef struct tagBitmapFileHeader 
{
    unsigned short bfType;
    unsigned int bfSize;
    unsigned short bfReserved1;
    unsigned short bfReserved2;
    unsigned int bfOffBits;
} BitmapFileHeader;
#pragma pack(pop)


Тогда  sizeof будет давать 14, а не 16.

Это сообщение отредактировал(а) smoke_man - 13.1.2010, 14:45


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0554 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.