Witam
mam taki problem ze nie umiem wyświetlić obrazka który jest zapisany w formacie DIB próbowałem zrobić to jak ze zwykłym bmp ale niestety pokazywały się tylko jakieś śmiecie ;-( czy ktoś wie jak można to zrobić jakich funkcji użyć ?? 8-O
Lichoo... ja do tej pory mało pracowałem z bitmapkami własnoręcznie, ale zawsze myślałem, że bmp i dib pod Windowsem to jeden pies. btw: w czym to zrobić? Własnoręcznie przetwarzać plik, czy może w GDI Windowsa, a może w czymś jeszcze innym. Na tę chwilę potrafię tylko tyle:
http://en.wikipedia.org/wiki/Device-independent_bitmap#Typical_file_format
Te diby i bmp to chyba jeden pies, na wiki i na msdnie są to nazwy używane zamiennie, problem w tym, że te bitmapy mają kilka różnych standardów ;)
próbowałem zrobić to jak ze zwykłym bmp
Czyli...? Są różne sposoby na zrobienie tego (od skorzystania z jakichś gotowych funkcji do własnoręcznego napisania wszystkich potrzebnych struktur, z kilkoma sposobami pomiędzy ;)) więc napisz, jaki sposób ci nie działa ;)
Z tym co podałeś to przychodzi mi do głowy tylko że (zakładam, że korzystasz ze struktur z windows.h):
- zastosowałeś zły drugi header (np. nie BITMAPINFOHEADER tylko BITMAPCOREHEADER), skoro plik ma rozszerzenie dib to pewno jakiś starszy (teraz się chyba już tego nie używa)
- plik ma indeksowane kolory a ty odczytujeszgo tak, jak zwykły
- odwrotnie ;)
Warto też zerknąć tu: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_7ltf.asp
dziekuje za zainteresowanie i pomocą :) a kod do wyrysowania bitmapki wygląda tak:
BITMAPFILEHEADER head;
BITMAPINFOHEADER head_img;
RGBTRIPLE pixel;
FILE *f;
BYTE bajt;
if((f = fopen("klatka.bmp", "rb")) == NULL)
MessageBox("Nie można otworzy pliku!", "Błąd", MB_OK|MB_ICONERROR);
else{
fread(&head, sizeof(head), 1, f); //wczytujemy nagłówek pliku
fread(&head_img, sizeof(head_img), 1, f); //wczytujemy nagłówek rysunku
//
int nKorekta = head_img.biWidth % 4;
//odczytujemy piksele i rysujemy w dialogu:
for(int i=0; i < head_img.biHeight; i++){
for(int j=0; j < head_img.biWidth; j++){
fread(&pixel, sizeof(pixel), 1, f);
dc.SetPixel(j, head_img.biHeight - i, RGB(pixel.rgbtRed, pixel.rgbtGreen, pixel.rgbtBlue));
}
for(int x=0; x < nKorekta; x++)
fread(&bajt, sizeof(BYTE), 1, f);
taki mam kod w funkcji OnPaint() i jeżeli chodzi o rysowanie .bmp to wszystko świetnie działa a jak mam ten drugi format .dib który jak (chyba) dobrze rozumiałem jest również bitmapą wywala mi jakieś śmiecie mimo że na podglądzie w przeglądarce do zdjęć jest ładny obrazek :/
chodzi mi o ten format dib bo w takim formacie zapisywane są klatki z kamerki a chciałbym je móc otworzyć do edycji żeby można było coś z nimi pokombinować :)
Czyli pewnie coś z tych rzeczy o których napisałem w poprzednim poście (jest jeszcze jedna możliwość: plik jest kompresowany za pomocą algorytmu Run-Length Encoding (RLE), wtedy długie ciągi takich samych wartości są zamieniane coś w stylu 'liczba|wartość', np. 'wwww' byłoby zamienione na '4w', chociaż nie jestem do końca pewny jak to wygląda to w bitmapach. W każdym razie możesz podejrzeć biCompression by się upewnić). Pobaw się hexedytorem i spróbuj sprawdzić, do jakich struktur ze strony, którą podałem pasuje ten plik, albo podeślij mi na maila pare takich plików, mogę spróbować sam to zrobić ;)
ok dzięki za podpowiedź
postaram się przez weekend zrobić to co napisałeś i mam nadzieję że się uda to załatwić :)
a gdybym sobie nie poradził to będę Cię jeszcze nękał :-) ;-)