Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wczytywanie strumienia danych

Ostatnio zmodyfikowano 2011-03-31 01:40
Autor Wiadomość
Mapet
Temat założony przez niniejszego użytkownika
Wczytywanie strumienia danych
» 2011-03-30 18:06:01
Witam!

Mam problem z wczytaniem danych z pliku a konkretnie nagłowka z bitmapy.

C/C++
#include <cstdlib>
#include <iostream>
#include <string>
#include <fstream>

using namespace std;

typedef unsigned char BYTE; // 1byte
typedef unsigned short WORD; // 2bytes
typedef unsigned long DWORD; //4bytes

struct RGB {
    BYTE blue;
    BYTE green;
    BYTE red;
};

struct BitMapFileHeader {
    WORD bfType;
    DWORD bfSize;
    WORD bfReserved1;
    WORD bfReserved2;
    DWORD bfOffBits;
};

struct BitMapInfoHeader {
    DWORD biSize;
    DWORD biWidth;
    DWORD biHeight;
    WORD biPlanes;
    WORD biBitCount;
    DWORD biCompression;
    DWORD biSizeImage;
    DWORD biXPelsPerMeter;
    DWORD biYPelsPerMeter;
    DWORD biClrUsed;
    BYTE biClrImportant;
    BYTE biClrRotation;
    WORD biReserved;
};

class BMP {
public:
    BitMapFileHeader BMFH;
    BitMapInfoHeader BMIH;
   
    RGB ** Img;
   
    string path;
    BMP();
    ~BMP();
};

BMP::BMP() {
   
    fstream in;
    in.open( "test.bmp", ios::in | ios::binary );
    in.read(( char * ) & BMFH, sizeof( BitMapFileHeader ) );
    in.read(( char * ) & BMFH, sizeof( BitMapInfoHeader ) );
   
    cout << BMIH.biWidth << endl;
   
}

BMP::~BMP() {
    //delete [] Img;
}



int main( int argc, char ** argv ) {
   
    BMP obrazek;
    //obrazek.save("wynik.bmp");
    return 0;
}

Stworzyłem sobie struktury mające w sumie 54 bajty tyle ile nagłówek i za pomocą read() wczytuje cały blok danych. Niestety dane odczytywane w taki sposób


cout << BMIH.biWidth << endl;

wyprowadza złe wartości. Myślałam że pomyliłem się budując strukturę i za mało bajtów gdzieś dałem ale wygląda wszystko w porządku. Będę wdzięczny za szybką odpowiedź
P-30003
malan
» 2011-03-30 21:45:54
Jestem wielki... :D
C/C++
std::cout << BMIH.biSize << std::endl;
std::cout << BMIH.biWidth << std::endl;
std::cout << BMIH.biHeight << std::endl;
40
800
600
No więc masz..., a właściwie nie masz czegoś, co psuje Ci cały program. Ja nigdy wcześniej nie interesowałem się tego typu rzeczami, a wpisałem 3 litery w wyszukiwarce, poprawiłem Twój kod i rozwiązałem problem :). Także - doczytaj dokładnie o nagłówku pliku :)
P-30014
Mapet
Temat założony przez niniejszego użytkownika
» 2011-03-31 00:25:35
No ja to robię w ten sposób że wczytuje po przez read każdej zmiennej odpowiednią ilość bajtów i też działa poprawnie. Ale tych zmiennych trochę jest i dużo trzeba pisać.
P-30022
malan
» 2011-03-31 00:38:56
Nie rozumiem Cie ;p Ten pseudokod i log to tylko potwierdzenie, że poprawiony przez mnie kod działa. Ostatnie zdanie w moim poście to podpowiedź jak masz rozwiązać swój problem :)
P-30023
Mapet
Temat założony przez niniejszego użytkownika
» 2011-03-31 01:40:08
Sorry nie zrozumiałem cie, na swoje usprawiedliwienie powiem tylko że o takiej porze ciężko się myśli. Wracając do problemu wszystko stało się jasne gdy zrobiłem sobie sizeof moich struktur. Ni stąd ni z zowąd pojawiły się 2 dodatkowe bajty. Powodem tego był problem z wyrównywaniem bitów a rozwiązaniem było przeniesienie

C/C++
WORD bfType;

do nowo utworzonej struktury

C/C++
struct bmpfile_magic {
    WORD bfType;
};

Dzięki wielkie za pomoc :P

P-30025
« 1 »
  Strona 1 z 1