Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

C++ - Źle działająca biblioteka fstream

03 Nov 2012 23:10 1167 8
  • Level 14  
    Witam,
    mam pewien problem z którym boryka się kilka osób ode mnie na studiach. Mamy do napisania program do obracania bitmapy. Otóż wykorzystując wczytywanie bajtów przy wykorzystaniu funkcji getc program działa. Natomiast korzystając z funkcji write z biblioteki fstream piksele zostają źle wczytane do pliku. Największe moje zdziwienie jest takie, iż dla kwadratowych obrazków fstrem działa, słyszałem również, iż komuś na platformie linux fstream również dobrze działa. Może my wszyscy coś przeoczyliśmy. Ja kompilowałem na Visual Studio 2010 i tylko kwadratowe obraca. Zostawiam główny kawałek kodu:

    Code: cpp
    Log in, to see the code


    Przeglądając pliki binarnie programem zauważyłem w obracanym obrazku śmieci w niektórych miejscach, których w oryginale nie ma. Ale najbardziej mnie ciekawi to, iż dla kwadratowych obrazków wszystko działa, co świadczy, że styl programu jest dobry tzn. nie gubi informacji, zachowane są wszystkie bajty. Bardzo bylibyśmy wdzięczni na rozgryzienie tego problemu.
  • Level 27  
    Przy wyświetlaniu powinno być chyba buf[j][i]
  • Level 14  
    jeżeli chodzi o linię w ostatnim forze:
    Code: cpp
    Log in, to see the code

    to zmiana nic nie daje. Kwadratowe zdjęcie staje się obrócone o 180 stopni po twojej zmianie. Myślę, że to wina raczej funkcji z fstream. Może wystarczy wstawić jakaś flagę bo program analizowałem dziesiątki razy i nie mogę znaleźć błędu.
  • Level 42  
    Co to jest za stała RGB i jaki jest jej rozmiar? Z jaką BMP pracujesz pod względem palety barw? Dlaczego przy zamianie wymiarów w nagłówku stosujesz rzutowania jakieś? Czemu zmienna tmp nie jest we właściwym typie?
  • Level 14  
    Program napisany jest pod bitmapę 24 bitową czyli brak w pliku palety kolorów przed pikselami.
    struktura RGB (3 bajty):
    Code: cpp
    Log in, to see the code


    zmienna tmp to wskaźnik void. Wskazuje ona na miejsce pamięci gdzie znajduje się width, po to by po jego zmianie był punkt odniesienia. int32_t to rozmiar zmiennych rozmiarów obrazka. Rzutowanie działa tzn. struktura zachowuje swój rozmiar i zmienioną szerokość i długość obrazka. Próbowałem też robić to w normalny sposób i jest to samo. Obrazek po operacji obracania jest obrócony co widać w przeglądarce zdjęć, tylko ma całkowicie inne kolory. Operacja tylko działa poprawnie dla kwadratowych zdjęć.
  • Level 42  
    A czy problem nie jest czasem w tym, że element tablicy traktujesz jako char*, podczas gdy struktura ma w rzeczywistości 3*byte ?

    A dla testu - jeśli pominiesz pętlę odwracającą oraz zamienianie wymiarów, to zapisuje poprawnie? A czy po tej zamianie dostajesz plik o identycznej wielkości jak wejściowy?

    Powiedz jeszcze, jak zdeklarowana jest zmienna bitmapImage?
  • Level 14  
    Muszę rzutować go jako char* ponieważ tego wymaga argument funkcji write/read. Wszystko się wydaj ok, ponieważ char oraz byte to 1 bajt. Jak każe funkcji wczytać/wgrać char o wielkości 3 bajtów to będą to następne 3 bajty charów.

    Jeżeli pominę pętlę odwracającą to obrazek jest skopiowany o identycznej ilości bajtów, wyświetlany jest poprawnie.

    deklaracja zmiennej buf oraz bitmapImage:
    Code: cpp
    Log in, to see the code
  • Level 42  
    A sprawdź jeszcze, czy buf jest poprawnie alokowana z zamienionymi wymiarami?

    Ponadto w pętli zamieniającej idenksujesz [j][...i], a więc [wsk_wysokości][wsk_szerokości] podczas gdy przy zapisie [i][j], czyli [wsk_szerokosci][wsk_wysokości].

    Czyli - owszem, zamiana jest wykonana poprawnie, ale niepoprawnie odwołujesz się przy zapisie do indeksów (tutaj nie uwzględniłeś zamiany wysokości z szerokością)
  • Level 14  
    Znalazłem może przyczynę. Wyczytałem, że:
    Quote:
    Niezależnie od szerokości rysunku, każdy jego wiersz zajmuje wielokrotność czterech bajtów, a niewykorzystana końcówka wypełniona jest zerami.

    Zmodyfikowałem pętlę:
    Code: cpp
    Log in, to see the code


    Jest jeszcze jeden mankamęt. Jeżeli ja dodam zera do tablicy pikseli to wielkość obrazka automatycznie jest większa więc trzeba uwzględnić to w strukturach. Stworzyłem obrazek o bokach podzielnych przez 4 i wszystko działa więc pętle muszą być dobre... Popróbuję coś z tym zrobić i dam znać czy się udało.

    Poddaje się. Zmieniłem wielkości w strukturach, dodaję zera na końcu wierszy i dalej tylko dobrze działa z bokami podzielnymi przez 4.

    Jak ktoś chce sobie pogłówkować dodaję cały program.