Um mit digitalen Fotos arbeiten zu können,
müssen zwei Unterschiede zwischen „unserer“ Definition von Bildern
und digitalen Fotos, die in diversen Dateiformaten
auftreten können, beachtet werden:
- •„unsere“
Bilder sind unendlich gross
- •Digitale
Fotos sind endliche diskrete Arrays
Digitale Fotos werden deshalb durch Dimensionen und eine „subscripting“
Funktion beschrieben.
data Array2 α = Array2 Int Int ((Int, Int) → α)
Der Wert Array2 n m f repräsentiert die n:m Reihen,
mit f als Index.
Anstatt nun ein Array eines konkreten Formates zu erstellen und zu
speichern, wird die Konversion von der Dateirepräsentation (z.B.
1, 8, 16, 24 Bit pro Pixel) direkt während des subscripting
durchgeführt. Die Konversion besteht aus einer
Überprüfung ob sich die Punkte innerhalb oder ausserhalb der
Bildfläche befinden. Ausserhlab liegende Punkte werden unsichtbar.
Innenliegende Punkte müssen interpoliert werden, sie nicht direkt
einem Punkt aus dem diskreten Set von Punkten zu geordnet werden
können. Zur Interpolation werden die vier direkt benachbarten
gewichtet herangezogen.
Subscription
bilerpArray2
:: ((Int, Int) → Colour) → ImageC
bilerpArray2 sub (x, y) =
let
i = x; wx = x - fromInt i
j = y; wy = y - fromInt j
in
bilerpC (sub (i, j )) (sub (i + 1, j ))
(sub (i, j + 1)) (sub (i + 1, j + 1))
(wx,wy) (1)
(1) wx, wy sind die Gewichtung
Abschliessend wird das Bild in einem unendlichen Bild rekonstruiert.
Hierbei werden ausserhalb des ursprünglichen Bildes liegende
Punkte unsichtbar.
Dann wird das Bild noch auf den Koordinatenursprung zentriert.
reconstruct :: Array2 Colour → ImageC
reconstruct (Array2 w hsub) =
move (- fromInt w / 2, - fromInt h / 2)
(crop (inBounds w h) (bilerpArray2 sub)) (2)
inBounds :: Int → Int → Region
inBounds w h (x, y) = 0 <= x && x <= fromInt (w - 1) &&
0
<=
y && y <= fromInt (h - 1)
(2)
move zentriert das Bild auf den Ursprung.