Jak wczytac bitmape?

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.

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 na pewno>. 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.

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.

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.

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 by me ;-) 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.

  1. 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 unsigned char<!>

  2. 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 fread

Pozdrawiam.

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).

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.

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.

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.

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 na pewno 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.

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 na pewno 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).

0

Moze i .bmp to wymysl microsoftu nie mi ta wiedza dana, ale skad by to nie powstalo to specyfikacja jest jedna i nie dzieli sie na bitmapy windowsowe/linuxowe<chociaz wlasnie tak przegladam wikipedie [nie polska rzecz jasna bo na niej niestety niewiele jest] i tam sa dwa topy na temat bitmap jeden to Windows_bitmap mowiacy o specyfikacji bitmapy[i nietylko] a drugi to bitmap okreslajaca co to w ogóle jest bitmapa -- wiec moze i te .bmp to twor windowsa ale tak czy siak linux z tego tworu windowsowego korzysta, wiec podzialu jako takiego nie ma na windows/linux>.

Mialem napisac o tym RGB/BGR ale zapomnialem.

Część 'nie do konca pewna'<czyli odsylam="odsylam" do="do" specyfikacji="specyfikacji" i="i" tym="tym" podobnych="podobnych" rzeczy="rzeczy" na="na" temat="temat" bitmap="bitmap">:
Co ciekawe, to z tego co gdzies czytalem, to nie wszystkie bitmapy maja odwrocone kolory<!> i tutaj wlasciwie tez jest ta, powiedzmy, zasadnicza roznica pomiedzy bitmapami i chodzi mi po glowie taki 'twor' jak OS/2, bo zapewne on sie takimi niezmienionymi bitmapami 'posluguje', ale pewnosci nie mam zadnej bo dawno o tym czytalem wiec moze to jednak nie OS/2 a cos innego i mozliwe, ze takie bitmapy nie maja standardowego rozszerzenia .bmp...
Mimo wszystko .bmp, ktorych na codzien uzywamy maja zamieniony kanal R z G.
Koniec czesci 'nie do konca pewnej'.

Ps. Bitmapa to nie tylko .bmp ;-) Ale w tym co pisalem zakladalem, ze wlasnie o takie 'cos' chodzi<no moze z pewnymi wyjatkami ;-)>.

Pozdrawiam.

0
Joker napisał(a)

Ps. Bitmapa to nie tylko .bmp ;-) Ale w tym co pisalem zakladalem, ze wlasnie o takie 'cos' chodzi<no moze z pewnymi wyjatkami ;-)>.

No w sumie tak, tyle że wtedy za bitmapy można by uznać równie dobrze np. pliki .tga o zupełnie innym nagłówku (po 'odcedzeniu' nagłówka oba te typy niczym się od siebie nie różnią (tj. .tga może, zdaje się, występować w paru różnych wersjach, ale najczęściej używana jest ta 'zwykła' ;))) więc chyba lepiej używać określenia 'bitmapa' tylko dla jej 'standardowego' formatu, tak by nie wprowadzać niepotrzebnego zamętu ;)

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