Jak wczytac bitmape?

Odpowiedz Nowy wątek
2007-01-14 18:37

Rejestracja: 13 lat temu

Ostatnio: 13 lat temu

0

Mam problem poniewaz nie wiem jak wczytac bitmape. Bitmapa jest czarno-biala. Nastepnie musze zrobic jeszcze zliczanie pikseli w poszczegolnych obszarach obrazka. Dzialam pod linuksem i nie moge znalezc tam odpowiednich bibliotek, takich jak sa np. w Visualu. Jesli ktos zna cos takiego lub wie jak to zrobic bez uzywania specjalistycznych bibliotek to bardzo prosze o pomoc :) Chodzi mi glownie o samo wczytywanie z uwzglednieniem przy tym pozniejszego dostepu do pikseli.

Pozostało 580 znaków

2007-01-14 19:06

Rejestracja: 14 lat temu

Ostatnio: 4 lata temu

0

Kiedys pisalem funkcje czytajaca bitmape, jest o tym wiele na necie z tym, ze niektore rzeczy nie sa dobrze napisane ale przy porownywaniu np. kodow trzech autorow mozna dojsc jak skonstruwac najlepszy<opcja jezeli="jezeli" nie="nie" chcesz="chcesz" kombinowac="kombinowac" z="z" tym="tym" jak="jak" taka="taka" bitmape="bitmape" zczytac="zczytac" to="to" wlasnie="wlasnie" zagladanie="zagladanie" do="do" kodow="kodow" innych="innych" ludzi="ludzi">. Jednak czy bediesz zagladal do cudzych kodow czy sam takowy stworzysz to bez wzgledu na to bedizesz potrzebowal wiedziec co sie dzieje wiec poczytaj o naglowku/strukturze bitmapy<tez jak="jak" w="w" poprzednim="poprzednim" przypadku="przypadku" znajdziesz="znajdziesz" to="to" na="na" necie="necie">.

Mozna tez sciagnac z netu gotowe biblioteki do czytania bitmap i nie tylko jedna przykladowa to DevIL o ile mnie pamiec nie myli<jezeli jednak myli to mozliwe ze chodzi o OpenIL - ktoras z tych napewno>. Jednak do niej jest potrzebnych takze pare innych bibliotek czyli tak czy siak bedziesz musial poswiecic troche czasu na czytanie plikow readme i myslenie.

Gotowego rozwiazania nie podam a to wlasnie ze wzgledu na to, ze nie szukales a roboty za kogos odwalac, w dodatku za darmo, nie bede co najwyzej moge pomoc, doradzic ewentualnie napisac mniej wiecej co nalezalo by zrobic ale to dopiero po tym jak pokazalbys, ze cokolwiek zrobiles.

Ps. Programowanie nie polega na tym zeby isc na latwizne<a przynajmniej nie az taka, zeby zwalac robote na innych>.

Pozdrawiam.


"(2b || !(2b)) == question" W. Shakespeare

Pozostało 580 znaków

2007-01-14 19:24

Rejestracja: 13 lat temu

Ostatnio: 13 lat temu

0

Zgadzam sie z Toba w pelni. Chodzi o to, ze sporo czytalem, zasiagalem tez opinii innych, a umieszczenie tego posta wlasnie tu jest w pewnym sensie aktem desperacji :-/ Juz zaczalem sie zastanawiac czy nie pojsc na tak zwana "latwizne" i zainstalowac sobie Windowsa ;-) Nie wiem jak np wyciagac potrzebne dane z naglowka pliku bmp. Nie moge zrozumiec jak maja sie piklsele do bajtow (bo jedynym sposobem jak na razie na wczytanie bitmapy jaki znam to "bajt po bajcie"). Mam do wczytania ponad 6000 tysiecy obrazkow, ktore roznia sie wielkoscia i oczywiscie tym co na nich jest. Pozniej musze porownywac ze soba uklad pikseli w celu dopasowania najbardziej podobnych, ale to juz odzielny problem i nie o to mi chodzi.

Pozostało 580 znaków

2007-01-14 19:27

Rejestracja: 13 lat temu

Ostatnio: 13 lat temu

0

Zgadzam sie z Toba w pelni. Chodzi o to, ze sporo czytalem, zasiagalem tez opinii innych, a umieszczenie tego posta wlasnie tu jest w pewnym sensie aktem desperacji :-/ Juz zaczalem sie zastanawiac czy nie pojsc na tak zwana "latwizne" i zainstalowac sobie Windowsa ;-) Nie wiem jak np wyciagac potrzebne dane z naglowka pliku bmp. Nie moge zrozumiec jak maja sie piklsele do bajtow. Bo jedynym sposobem jak na razie na wczytanie bitmapy jaki znam to "bajt po bajcie" poprzez funkcje fopen i fread. Nie wiem czy dobrze kombinuje majac w perspektywie konkretne zadanie. Mam do wczytania ponad 6000 tysiecy obrazkow, ktore roznia sie wielkoscia i oczywiscie tym co na nich jest. Pozniej musze porownywac je ze soba (czyli uklad pikseli i ich liczbe) w celu dopasowania najbardziej podobnych, ale to juz odzielny problem i nie o to mi chodzi.

Pozostało 580 znaków

2007-01-14 20:12

Rejestracja: 14 lat temu

Ostatnio: 4 lata temu

0

No wiec tak:
Jezeli wiesz jak otwierac i czytac z plikow binarnych dane to jestes o wiele bardziej do przodu niz ja bylem jak bitmape zczytywalem wiec skoro ja sobie poradzilem toty tym bardziej jezeli jednak nie wiesz tego to podaje wskazowki :

  1. Sa rozne rodzaje bitmap a kazdy sie czyta inaczej, natomiast ja zczytywalem jedynie te o 24 bitowej glebii kolorow<nie wiem czy bitmapy o ktorych piszesz ze sa czarno biale sa czarno biale w 24 bitowej glebii czy tez w 8 bitowej wiec opierac sie bede na tym co znam czyli -> 24 bitowa glebia>

  2. Naglowek bitmapy dowolnej<!> wyglada tak:

    
    typedef struct tagBITMAPFILEHEADER {
    unsigned short  bfType;
    unsigned long   bfSize;
    unsigned short  bfReserved1;
    unsigned short  bfReserved2;
    unsigned long   bfOffBits;
    } BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER{
unsigned long biSize;
long biWidth;
long biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned long biCompression;
unsigned long biSizeImage;
long biXPelsPerMeter;
long biYPelsPerMeter;
unsigned long biClrUsed;
unsigned long biClrImportant;
} BITMAPINFOHEADER;

typedef struct tagRGBQUAD {
unsigned char rgbBlue;
unsigned char rgbGreen;
unsigned char rgbRed;
unsigned char rgbReserved;
} RGBQUAD;

typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;


to jest przerobione z odpowiednich plikow naglowkowych windowsa <i>by me</i> ;-) i w sumie to tez mozna znalezc na necie...
Ale do rzeczy - jezeli chodzi o 24 bitowa glebie kolorow to interesowac ciebie beda tylko dwie pierwsze struktury<dwie pozostale to jak sie nie myle sa do bitmap o 8 bitowej glebii kolorow ktore zawieraja tzw. palete kolorow[trzecia struktura]>. Wiec aby zczytac naglowek bitmapy nalezy czytac z pliku kolejne wartosci znajdujace sie w tych strukturach.

3. W naglowku sa umieszczone informacje dotyczace, miedzy innymi: szerokosci, wysokosci oraz wielkosci obrazka<!>. te informacje beda ci potrzebne przy czytaniu 'obrazka wlasciwego' np. wielkosc obrazka to rozmiar tablicy typu <b>unsigned char</b><!>

4. Pixele maja sie do bajtow w ten sposob, ze:
  - jeden bajt to 8 bitow czyli wartosci od 0..255
  - na wartosc RGB skladaja sie trzy bajty<po jednym na kazdy z kolorow: Red, Green, Blue>
  - czytasz bit po bicie tzn. czytasz po kolei na zmiane wartosc koloru czerwonego(R), zielonego(G) i niebieskiego(B)
Innymi slowy jezeli wartosc R = 255, G = 0, B = 0 to mamy kolor czerowny<ktory i tak cie nie interesuje skoro masz czarno - biale bitmapy;-)>

No i to chyba wszystko. Aha dane z pliku czyli np. te dotyczace naglowka czytasz przy uzyciu funkcji <i>fread</i>

Pozdrawiam.

"(2b || !(2b)) == question" W. Shakespeare

Pozostało 580 znaków

2007-01-14 22:03

Rejestracja: 13 lat temu

Ostatnio: 10 lat temu

0

Joker - tyle że on ma (chyba) zamiar czytać bitmapy linuxowe, a ty mu podałeś nagłówki bitmap windowsowych. ;)

A ogólna zasada odczytywania obrazków (nie tylko bitmap) wygląda mniej więcej tak: najpierw szukasz w sieci specyfikacji formatu (z czego składa się nagłówek, czy plik jest w jakikolwiek sposób kompresowany, itp), a potem już z górki, kod (dla c++) wygląda tak (gdzie HEADER to stworzona przez ciebie struktura opisująca nagłówek pliku (zakładam że zawiera pola width, height i bitcount (ile bitów na pixel), bo chyba w każdym formacie plików w nagłówku są podane wymiary i wielkość pixela), a image to tablica char'ów z danymi obrazu):

char* readImage(const char* filename)
{
 ifstream ifs(filename);
 HEADER* header;
 char* image;

 char* temp = new char[sizeof(HEADER)];
 ifs.read(temp, sizeof(HEADER));
 header = (HEADER*)temp;

 int size = header->height * header->width * (header->bitcount / 8);
 image = new char[size];
 ifs.read(image, size);

// jeśli odczytujemy jotpegi czy inne szajsy to tu jest miejsce na funkcję 'odkompresowującą'

 delete header;
 return image;

W twoim przypadku można pominąć bitcount (bo i tak zakładasz, że na każdy pixel przypada jeden bajt).


but there's no sense crying over every mistake
you just keep on trying till you run out of cake

Pozostało 580 znaków

2007-01-14 22:16

Rejestracja: 13 lat temu

Ostatnio: 13 lat temu

0

Dzieki wielkie za zainteresowanie i pomoc. Pamietam, ze przegladajac rozne stronki zetknalem sie z bardzo podobnym kodem lecz nie moglem go do konca rozkminic. Mam nadzieje, ze teraz sobie poradze bo wyjasnilem kilka niuansow, ktore mnie gnebily. Dzieki. Pozdro.

Pozostało 580 znaków

2007-01-14 22:17

Rejestracja: 13 lat temu

Ostatnio: 13 lat temu

0

Dzieki wielkie za zainteresowanie i pomoc. Pamietam, ze przegladajac rozne stronki zetknalem sie z bardzo podobnym kodem (strukturami dokladniej rzecz biorac) lecz nie moglem go do konca rozkminic. Mam nadzieje, ze teraz sobie poradze bo wyjasnilem kilka niuansow, ktore mnie gnebily. Dzieki. Pozdro.

Pozostało 580 znaków

2007-01-14 22:18

Rejestracja: 13 lat temu

Ostatnio: 13 lat temu

0

Dzieki wielkie za zainteresowanie i pomoc. Pamietam, ze przegladajac rozne stronki zetknalem sie z bardzo podobnym kodem (strukturami dokladniej rzecz biorac) lecz nie moglem go do konca rozkminic. Mam nadzieje, ze teraz sobie poradze bo wyjasnilem kilka niuansow, ktore mnie gnebily. Dzieki. Pozdro.

Pozostało 580 znaków

2007-01-15 02:40

Rejestracja: 14 lat temu

Ostatnio: 4 lata temu

0

Ghostek> Bitmapy windowsowe i linuxowe... ;-) Specyfikacja bitmap jest jedna, co najwyzej dziela sie one przede wszystkim ze wzgledu na glebie kolorow<np. przy glebii 32 bitowej jest dodatkowy kanal alpha odpowiedzialny za przezroczystosc bitmapy, 8 bitowe o ile sie nie myle, a zapewne sie myle, maja palete kolorow sa tez bitmapy kompresowane, z tego co gdzies czytalem, ale czy te aby napewno maja standardowe rozszerzenie .bmp, tego to juz nie pamietam - no niewazne zreszta>.

Co do naglowka, to jak napisalem -> to jest przerobione by me z plikow windowsowych czyli dopuki sie nie zainkluduje bibliotek windowsowych to bedzie to dzialac na kazdym systemie<dlaczego po zainkludowaniu bibliotek windowsa nie bedize dzialac? hmm.. bo tak sobie obmyslilem, ze pozostawie nazwy tych struktur niezmienione<!> bo wtedy kod bedzie w 100% przenosny jezeli sie zastosuje preprocesor[np. sprawdzal by on czy biblioteki windowsowe sa zainkludowane, jezeli sa to nie tworzy tych struktur<ktore sa="sa" wypisane="wypisane" w="w" moim="moim" poscie="poscie" powyzej="powyzej"> ale<tu uwaga!> program nadal moze korzystac z tych samych nazw, ktore sa juz w pliku naglowkowym windows.h bodajze - czyli cos bardzo dynamicznego a zarazem przenosnego>.

Zagmatwalem chyba nawet nie troche ale bardzo bardzo, ale to z tego powodu, ze juz pozno a na dodatek drugi dzien z kolei siedze nad baza danych i poprawiam ja i nie wiem o ktorej skoncze... :-/

Pozdrawiam.


"(2b || !(2b)) == question" W. Shakespeare

Pozostało 580 znaków

2007-01-15 12:17

Rejestracja: 13 lat temu

Ostatnio: 10 lat temu

0
Joker napisał(a)

Ghostek> Bitmapy windowsowe i linuxowe... ;-) Specyfikacja bitmap jest jedna, co najwyzej dziela sie one przede wszystkim ze wzgledu na glebie kolorow<np. przy glebii 32 bitowej jest dodatkowy kanal alpha odpowiedzialny za przezroczystosc bitmapy, 8 bitowe o ile sie nie myle, a zapewne sie myle, maja palete kolorow sa tez bitmapy kompresowane, z tego co gdzies czytalem, ale czy te aby napewno maja standardowe rozszerzenie .bmp, tego to juz nie pamietam - no niewazne zreszta>.

To zwracam honor, myślałem, że bitmapy .bmp to wymysł microsoftu ;)

A tak poza tym, to jeszcze trzeba pamiętać o tym, że format kolorów w bitmapach to nie RGB (czy RGBA w wypadku tych z przezroczystością) a BGR (lub ABGR).


but there's no sense crying over every mistake
you just keep on trying till you run out of cake

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0