This is an old revision of the document!
W tym ćwiczeniu poćwiczysz zmianę danych z reprezentacji wskaźnikowej na reprezentację tablicową.
Do realizacji zadań pobierz i rozpakuj folder projektu: fotoszop-ex2.zip
Podczas realizacji zadań wykorzystaj ten projekt jako szkielet swojego programu.
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 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$:
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$$
load_bitmap()
tak, aby poprawnie przepisał wartości pikseli przechowywanych w miejscu wskazywanym przez bitmapBytes
(zawierającej wyrównane dane) do tablicy image
.save_bitmap()
dokonując operacji odwrotnej – przepisz wartości pikseli przechowywanych w tablicy image
do miejsca wskazywanego przez bitmapBytes
. 0
!