This shows you the differences between two versions of the page.
Both sides previous revision Previous revision | |||
dydaktyka:cprog:2015:photoshop:exercises:data_un_packing [2015/12/16 20:35] pkleczek |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Umieszczanie bajtów obrazu w tablicy ====== | ||
- | |||
- | W tym ćwiczeniu poćwiczysz zmianę danych z reprezentacji wskaźnikowej na reprezentację tablicową. | ||
- | |||
- | Do realizacji zadań pobierz i rozpakuj folder projektu: {{:dydaktyka:cprog:2015:photoshop:exercises:fotoszop-ex2.zip|}} \\ | ||
- | Podczas realizacji zadań wykorzystaj ten projekt jako szkielet swojego programu. | ||
- | |||
- | ===== Teoria ===== | ||
- | |||
- | Format graficzny BMP stosuje upakowanie pikseli obrazu wierszami, w "paczkach" o rozmiarze będącym wielokrotnością 4 bajtów. Stąd w naszym przypadku, jeśli szerokość obrazu nie jest wielokrotnością 4, dodana zostanie odpowiednia ilość bajtów wyrównania. Paczki te występują jedna po drugiej, w ciągu. | ||
- | |||
- | Rozmiar pojedynczej paczki wynosi | ||
- | $$\mbox{RowSize} = \left\lfloor\frac { \mbox{BitsPerPixel} \cdot \mbox{ImageWidth} + 31 }{32} \right\rfloor \cdot 4$$ | ||
- | przy czym w naszym przypadku $\mbox{BitsPerPixel} = 8$ (takie jest jedno z założeń projektowych). \\ | ||
- | Zapis $\left\lfloor x \right\rfloor$ oznacza //podłogę// liczby $x$, czyli największą liczbę całkowitą nie większa od $x$. | ||
- | |||
- | Jak wspomniano przy okazji [[dydaktyka:cprog:2015:arrays#deklarowanie1|deklarowania tablic wielowymiarowych]], komputer przechowuje w pamięci tablicę dwuwymiarową (perspektywa tablicowa) w sposób liniowy -- jako kilka następujących po sobie tablic jednowymiarowych (perspektywa wskaźnikowa). | ||
- | |||
- | Oto przykład takiego wyrównania dla obrazu o wymiarach $h \times w = 3 \times 2$: \\ | ||
- | {{:dydaktyka:cprog:2015:byte_packing.png?nolink|}} \\ | ||
- | przy czym | ||
- | $$\mbox{RowSize} = \left\lfloor\frac { \mbox{BitsPerPixel} \cdot \mbox{ImageWidth} + 31 }{32} \right\rfloor \cdot 4 = \left\lfloor\frac { 8 \cdot 2 + 31 }{32} \right\rfloor \cdot 4 = \left\lfloor 1,46875 \right\rfloor \cdot 4 = 1 \cdot 4 = 4$$ | ||
- | |||
- | ===== Zadanie PTR2MAT ===== | ||
- | |||
- | * Uzupełnij kod funkcji ''load_bitmap()'' tak, aby poprawnie przepisał wartości pikseli przechowywanych w miejscu wskazywanym przez ''bitmapBytes'' (zawierającej wyrównane dane) do tablicy ''image''. | ||
- | |||
- | * Uzupełnij kod funkcji ''save_bitmap()'' dokonując operacji odwrotnej -- przepisz wartości pikseli przechowywanych w tablicy ''image'' do miejsca wskazywanego przez ''bitmapBytes''. \\ Pamiętaj o nadaniu bajtom wyrównania wartości ''0''! | ||