Модераторы: Daevaorn
  

Поиск:

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


Новичок



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

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



Мне необходимо прочитать bmp-файл, два заголовка я считал, что дальше делать не пойму. Знаю только что каждая точка представлена 3-мя байтами, по байту на каждый цвет, а вот как разбить это все на 3-и матрицы где каждый цвет отдельно не пойму. Объясните. Вот мой исходник на всякий случай:
bmpheader.h
Код

#include <iostream>
#include <fstream>
using namespace std;

class BITMAPFILEHEADER
    {
    public:
        char bfType[2];
        unsigned int bfSize;
        unsigned short int bfReserved1;
        unsigned short int bfReserved2;
        unsigned int bfOfBits;

        BITMAPFILEHEADER()
        {
            bfType[2]='\0';
            bfSize=0;
            bfReserved1=0;
            bfReserved2=0;
            bfOfBits=0;
        }
        void Show()
        {
            cout << "bfType: " << bfType << endl;
            cout << dec <<"bfSize: " << bfSize <<" bytes" << endl;
            cout << dec <<"bfReserved1: " << bfReserved1 << endl;
            cout << dec <<"bfReserved2: " << bfReserved2 << endl;
            cout << dec <<"bfOfBits: " << bfOfBits << endl;

        }
        void Read(ifstream* f)
        {
            (*f).read(bfType,2);
            (*f).read((char*)&bfSize,4);
            (*f).read((char*)&bfReserved1,2);
            (*f).read((char*)&bfReserved2,2);
            (*f).read((char*)&bfOfBits,4);


        }

    };

class BITMAPINFOHEADER
    {
    public:
        unsigned int biSize;
        unsigned int biWidth;
        unsigned int biHeight;
        unsigned short int biPlanes;
        unsigned short int biBitCount;
        unsigned int biCompression;
        unsigned int biSizeImage;
        unsigned int biXPelsPerMeter;
        unsigned int biYPelsPerMeter;
        unsigned int biClrUsed;
        unsigned int biClrImportant;

        BITMAPINFOHEADER()
        {
            biSize=0;
            biWidth=0;
            biHeight=0;
            biPlanes=0;
            biBitCount=0;
            biCompression=0;
            biSizeImage=0;
            biXPelsPerMeter=0;
            biYPelsPerMeter=0;
            biClrUsed=0;
            biClrImportant=0;
        }

        void Show()
        {
            cout << dec << "biSize: " << biSize << endl;
            cout << dec << "biWidth: " << biWidth << endl;
            cout << dec << "biHeight: " << biHeight << endl;
            cout << dec << "biPlanes: " << biPlanes << endl;
            cout << dec << "biBitCount: " << biBitCount << endl;
            cout << dec << "biCompression: "<< biCompression << endl;
            cout << dec << "biSizeImage: " << biSizeImage << endl;
            cout << dec << "biXPelsPerMeter: " << biXPelsPerMeter << endl;
            cout << dec << "biYPelsPerMeter: " << biYPelsPerMeter << endl;
            cout << dec << "biClrUsed: " << biClrUsed << endl;
            cout << dec << "biClrImportant: " << biClrImportant << endl;
        }

        void Read(ifstream* f)
        {
            (*f).read((char*)&biSize,4);
            (*f).read((char*)&biWidth,4);
            (*f).read((char*)&biHeight,4);
            (*f).read((char*)&biPlanes,2);
            (*f).read((char*)&biBitCount,2);
            (*f).read((char*)&biCompression,4);
            (*f).read((char*)&biSizeImage,4);
            (*f).read((char*)&biXPelsPerMeter,4);
            (*f).read((char*)&biYPelsPerMeter,4);
            (*f).read((char*)&biClrUsed,4);
            (*f).read((char*)&biClrImportant,4);
        }


    };


main.cpp
Код

#include <iostream>
#include <fstream>
#include "bmpheader.h"
using namespace std;


int main(int argc, char* argv[])
{
    BITMAPFILEHEADER bfHead;
    BITMAPINFOHEADER biHead;
    ifstream bFile;

    if(argc!=2){
        cout << "|-----------------------------------------|"<< endl;
        cout << "|                                         |"<< endl;
        cout << "| Error! Input file name in command line. |"<< endl <<
                "| Example: lab1.exe bitmapfile.bmp        |"<< endl;
        cout << "|                                         |"<< endl;
        cout << "|-----------------------------------------|"<< endl;
        return 1;
    }


    bFile.open(argv[1],ios::binary);
    bfHead.Read(&bFile);
    cout<<"------------BITMAPFILEHEADER------------"<<endl;
    bfHead.Show();
    biHead.Read(&bFile);
    cout<<"------------BITMAPINFOHEADER------------"<<endl;
    biHead.Show();

    unsigned long temp[3];
    temp[3]='\0';



    bFile.close();

    return 0;
}

PM MAIL   Вверх
LPBOY
Дата 25.9.2005, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Dufrense @ 25.9.2005, 12:32)
как разбить это все на 3-и матрицы где каждый цвет отдельно не пойму.


Не проверял, но может как-нибудь так?

Код

char palette[255][3];
bFile.seekg(54);
bFile.read(palette, 256*4);

--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Dufrense
Дата 25.9.2005, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А как мне сделать 3 матрицы размером biHead.biWidth на biHead.biHeight ?
Дело в том что мне надо разобрать цвет каждой точки на составляющие. Т.е. получить 3 массива R G и B потом первести все это в формат YUV и сделать децимацию. Может кто-нить сталкивался с этим? Объясните хотя бы как три матрицы получить R G и B ведь их размер заранее не известен.
PM MAIL   Вверх
LPBOY
Дата 25.9.2005, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Это зависит от глубины цвета. Если изображение 24-битное тогда можно например так:

Создаешь три динамических массива
Код

size_t sz = biHead.biWidth * biHead.biHeight;
char *R = new char[sz];
char *G = new char[sz];
char *B = new char[sz];


Потом в цикле начиная с нужного смещения копируешь побайтно функцией get:

Код

for(int i=0; i<sz; ++i)
{
    B[i] = bFile.get();
    G[i] = bFile.get();
    R[i] = bFile.get();
}


Это сообщение отредактировал(а) LPBOY - 25.9.2005, 18:56
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
Guest
Дата 25.9.2005, 19:00 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











  Вверх
cardinal
Дата 25.9.2005, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

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





--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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