Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Опять BMP


Автор: Dufrense 25.9.2005, 12:32
Мне необходимо прочитать 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;
}

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


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

Код

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

Автор: Dufrense 25.9.2005, 17:29
А как мне сделать 3 матрицы размером biHead.biWidth на biHead.biHeight ?
Дело в том что мне надо разобрать цвет каждой точки на составляющие. Т.е. получить 3 массива R G и B потом первести все это в формат YUV и сделать децимацию. Может кто-нить сталкивался с этим? Объясните хотя бы как три матрицы получить R G и B ведь их размер заранее не известен.

Автор: LPBOY 25.9.2005, 18:56
Это зависит от глубины цвета. Если изображение 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();
}

Автор: Guest 25.9.2005, 19:00
http://vingrad.ru/CPP-MAIN-002457

Автор: cardinal 25.9.2005, 20:38
Читай про bmp тут:
http://forum.vingrad.ru/index.php?showtopic=45718&view=findpost&p=353238

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)