diff --git a/src/Aardvark.Base.Tensors/Aardvark.Base.Tensors.fsproj b/src/Aardvark.Base.Tensors/Aardvark.Base.Tensors.fsproj
index 263dd413..3ba10fad 100644
--- a/src/Aardvark.Base.Tensors/Aardvark.Base.Tensors.fsproj
+++ b/src/Aardvark.Base.Tensors/Aardvark.Base.Tensors.fsproj
@@ -20,9 +20,9 @@
     <Compile Include="Extensions\TensorUtilitiesGenerated.fs" />
     <Compile Include="Extensions\TensorMath.fs" />
     <Compile Include="Extensions\TensorSlicing.fs" />
+    <Compile Include="PixImage\ImageTrafo.fs" />
     <Compile Include="PixImage\PixImageErrorMetric.fs" />
     <Compile Include="PixImage\PixImageCube.fs" />
-    <Compile Include="PixImage\ImageTrafo.fs" />
     <Compile Include="PixImage\PixImageImageSharp.fs" />
     <Compile Include="Algorithms\QR.fs" />
     <Compile Include="Algorithms\SVD.fs" />
diff --git a/src/Aardvark.Base.Tensors/PixImage/ImageTrafo.fs b/src/Aardvark.Base.Tensors/PixImage/ImageTrafo.fs
index b7373013..71a210d0 100644
--- a/src/Aardvark.Base.Tensors/PixImage/ImageTrafo.fs
+++ b/src/Aardvark.Base.Tensors/PixImage/ImageTrafo.fs
@@ -3,75 +3,75 @@
 [<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
 module ImageTrafo =
     let private composeTable =
-        Dictionary.ofList [
-            (ImageTrafo.Identity, ImageTrafo.Identity), ImageTrafo.Identity
-            (ImageTrafo.Identity, ImageTrafo.Rot90), ImageTrafo.Rot90
-            (ImageTrafo.Identity, ImageTrafo.Rot180), ImageTrafo.Rot180
-            (ImageTrafo.Identity, ImageTrafo.Rot270), ImageTrafo.Rot270
-            (ImageTrafo.Identity, ImageTrafo.MirrorX), ImageTrafo.MirrorX
-            (ImageTrafo.Identity, ImageTrafo.Transpose), ImageTrafo.Transpose
-            (ImageTrafo.Identity, ImageTrafo.MirrorY), ImageTrafo.MirrorY
-            (ImageTrafo.Identity, ImageTrafo.Transverse), ImageTrafo.Transverse
-            (ImageTrafo.Rot90, ImageTrafo.Identity), ImageTrafo.Rot90
-            (ImageTrafo.Rot90, ImageTrafo.Rot90), ImageTrafo.Rot180
-            (ImageTrafo.Rot90, ImageTrafo.Rot180), ImageTrafo.Rot270
-            (ImageTrafo.Rot90, ImageTrafo.Rot270), ImageTrafo.Identity
-            (ImageTrafo.Rot90, ImageTrafo.MirrorX), ImageTrafo.Transverse
-            (ImageTrafo.Rot90, ImageTrafo.Transpose), ImageTrafo.MirrorX
-            (ImageTrafo.Rot90, ImageTrafo.MirrorY), ImageTrafo.Transpose
-            (ImageTrafo.Rot90, ImageTrafo.Transverse), ImageTrafo.MirrorY
-            (ImageTrafo.Rot180, ImageTrafo.Identity), ImageTrafo.Rot180
-            (ImageTrafo.Rot180, ImageTrafo.Rot90), ImageTrafo.Rot270
-            (ImageTrafo.Rot180, ImageTrafo.Rot180), ImageTrafo.Identity
-            (ImageTrafo.Rot180, ImageTrafo.Rot270), ImageTrafo.Rot90
-            (ImageTrafo.Rot180, ImageTrafo.MirrorX), ImageTrafo.MirrorY
-            (ImageTrafo.Rot180, ImageTrafo.Transpose), ImageTrafo.Transverse
-            (ImageTrafo.Rot180, ImageTrafo.MirrorY), ImageTrafo.MirrorX
-            (ImageTrafo.Rot180, ImageTrafo.Transverse), ImageTrafo.Transpose
-            (ImageTrafo.Rot270, ImageTrafo.Identity), ImageTrafo.Rot270
-            (ImageTrafo.Rot270, ImageTrafo.Rot90), ImageTrafo.Identity
-            (ImageTrafo.Rot270, ImageTrafo.Rot180), ImageTrafo.Rot90
-            (ImageTrafo.Rot270, ImageTrafo.Rot270), ImageTrafo.Rot180
-            (ImageTrafo.Rot270, ImageTrafo.MirrorX), ImageTrafo.Transpose
-            (ImageTrafo.Rot270, ImageTrafo.Transpose), ImageTrafo.MirrorY
-            (ImageTrafo.Rot270, ImageTrafo.MirrorY), ImageTrafo.Transverse
-            (ImageTrafo.Rot270, ImageTrafo.Transverse), ImageTrafo.MirrorX
-            (ImageTrafo.MirrorX, ImageTrafo.Identity), ImageTrafo.MirrorX
-            (ImageTrafo.MirrorX, ImageTrafo.Rot90), ImageTrafo.Transpose
-            (ImageTrafo.MirrorX, ImageTrafo.Rot180), ImageTrafo.MirrorY
-            (ImageTrafo.MirrorX, ImageTrafo.Rot270), ImageTrafo.Transverse
-            (ImageTrafo.MirrorX, ImageTrafo.MirrorX), ImageTrafo.Identity
-            (ImageTrafo.MirrorX, ImageTrafo.Transpose), ImageTrafo.Rot90
-            (ImageTrafo.MirrorX, ImageTrafo.MirrorY), ImageTrafo.Rot180
-            (ImageTrafo.MirrorX, ImageTrafo.Transverse), ImageTrafo.Rot270
-            (ImageTrafo.Transpose, ImageTrafo.Identity), ImageTrafo.Transpose
-            (ImageTrafo.Transpose, ImageTrafo.Rot90), ImageTrafo.MirrorY
-            (ImageTrafo.Transpose, ImageTrafo.Rot180), ImageTrafo.Transverse
-            (ImageTrafo.Transpose, ImageTrafo.Rot270), ImageTrafo.MirrorX
-            (ImageTrafo.Transpose, ImageTrafo.MirrorX), ImageTrafo.Rot270
-            (ImageTrafo.Transpose, ImageTrafo.Transpose), ImageTrafo.Identity
-            (ImageTrafo.Transpose, ImageTrafo.MirrorY), ImageTrafo.Rot90
-            (ImageTrafo.Transpose, ImageTrafo.Transverse), ImageTrafo.Rot180
-            (ImageTrafo.MirrorY, ImageTrafo.Identity), ImageTrafo.MirrorY
-            (ImageTrafo.MirrorY, ImageTrafo.Rot90), ImageTrafo.Transverse
-            (ImageTrafo.MirrorY, ImageTrafo.Rot180), ImageTrafo.MirrorX
-            (ImageTrafo.MirrorY, ImageTrafo.Rot270), ImageTrafo.Transpose
-            (ImageTrafo.MirrorY, ImageTrafo.MirrorX), ImageTrafo.Rot180
-            (ImageTrafo.MirrorY, ImageTrafo.Transpose), ImageTrafo.Rot270
-            (ImageTrafo.MirrorY, ImageTrafo.MirrorY), ImageTrafo.Identity
-            (ImageTrafo.MirrorY, ImageTrafo.Transverse), ImageTrafo.Rot90
-            (ImageTrafo.Transverse, ImageTrafo.Identity), ImageTrafo.Transverse
-            (ImageTrafo.Transverse, ImageTrafo.Rot90), ImageTrafo.MirrorX
-            (ImageTrafo.Transverse, ImageTrafo.Rot180), ImageTrafo.Transpose
-            (ImageTrafo.Transverse, ImageTrafo.Rot270), ImageTrafo.MirrorY
-            (ImageTrafo.Transverse, ImageTrafo.MirrorX), ImageTrafo.Rot90
-            (ImageTrafo.Transverse, ImageTrafo.Transpose), ImageTrafo.Rot180
-            (ImageTrafo.Transverse, ImageTrafo.MirrorY), ImageTrafo.Rot270
-            (ImageTrafo.Transverse, ImageTrafo.Transverse), ImageTrafo.Identity
+        LookupTable.lookupTable [
+            struct (ImageTrafo.Identity, ImageTrafo.Identity), ImageTrafo.Identity
+            struct (ImageTrafo.Identity, ImageTrafo.Rot90), ImageTrafo.Rot90
+            struct (ImageTrafo.Identity, ImageTrafo.Rot180), ImageTrafo.Rot180
+            struct (ImageTrafo.Identity, ImageTrafo.Rot270), ImageTrafo.Rot270
+            struct (ImageTrafo.Identity, ImageTrafo.MirrorX), ImageTrafo.MirrorX
+            struct (ImageTrafo.Identity, ImageTrafo.Transpose), ImageTrafo.Transpose
+            struct (ImageTrafo.Identity, ImageTrafo.MirrorY), ImageTrafo.MirrorY
+            struct (ImageTrafo.Identity, ImageTrafo.Transverse), ImageTrafo.Transverse
+            struct (ImageTrafo.Rot90, ImageTrafo.Identity), ImageTrafo.Rot90
+            struct (ImageTrafo.Rot90, ImageTrafo.Rot90), ImageTrafo.Rot180
+            struct (ImageTrafo.Rot90, ImageTrafo.Rot180), ImageTrafo.Rot270
+            struct (ImageTrafo.Rot90, ImageTrafo.Rot270), ImageTrafo.Identity
+            struct (ImageTrafo.Rot90, ImageTrafo.MirrorX), ImageTrafo.Transverse
+            struct (ImageTrafo.Rot90, ImageTrafo.Transpose), ImageTrafo.MirrorX
+            struct (ImageTrafo.Rot90, ImageTrafo.MirrorY), ImageTrafo.Transpose
+            struct (ImageTrafo.Rot90, ImageTrafo.Transverse), ImageTrafo.MirrorY
+            struct (ImageTrafo.Rot180, ImageTrafo.Identity), ImageTrafo.Rot180
+            struct (ImageTrafo.Rot180, ImageTrafo.Rot90), ImageTrafo.Rot270
+            struct (ImageTrafo.Rot180, ImageTrafo.Rot180), ImageTrafo.Identity
+            struct (ImageTrafo.Rot180, ImageTrafo.Rot270), ImageTrafo.Rot90
+            struct (ImageTrafo.Rot180, ImageTrafo.MirrorX), ImageTrafo.MirrorY
+            struct (ImageTrafo.Rot180, ImageTrafo.Transpose), ImageTrafo.Transverse
+            struct (ImageTrafo.Rot180, ImageTrafo.MirrorY), ImageTrafo.MirrorX
+            struct (ImageTrafo.Rot180, ImageTrafo.Transverse), ImageTrafo.Transpose
+            struct (ImageTrafo.Rot270, ImageTrafo.Identity), ImageTrafo.Rot270
+            struct (ImageTrafo.Rot270, ImageTrafo.Rot90), ImageTrafo.Identity
+            struct (ImageTrafo.Rot270, ImageTrafo.Rot180), ImageTrafo.Rot90
+            struct (ImageTrafo.Rot270, ImageTrafo.Rot270), ImageTrafo.Rot180
+            struct (ImageTrafo.Rot270, ImageTrafo.MirrorX), ImageTrafo.Transpose
+            struct (ImageTrafo.Rot270, ImageTrafo.Transpose), ImageTrafo.MirrorY
+            struct (ImageTrafo.Rot270, ImageTrafo.MirrorY), ImageTrafo.Transverse
+            struct (ImageTrafo.Rot270, ImageTrafo.Transverse), ImageTrafo.MirrorX
+            struct (ImageTrafo.MirrorX, ImageTrafo.Identity), ImageTrafo.MirrorX
+            struct (ImageTrafo.MirrorX, ImageTrafo.Rot90), ImageTrafo.Transpose
+            struct (ImageTrafo.MirrorX, ImageTrafo.Rot180), ImageTrafo.MirrorY
+            struct (ImageTrafo.MirrorX, ImageTrafo.Rot270), ImageTrafo.Transverse
+            struct (ImageTrafo.MirrorX, ImageTrafo.MirrorX), ImageTrafo.Identity
+            struct (ImageTrafo.MirrorX, ImageTrafo.Transpose), ImageTrafo.Rot90
+            struct (ImageTrafo.MirrorX, ImageTrafo.MirrorY), ImageTrafo.Rot180
+            struct (ImageTrafo.MirrorX, ImageTrafo.Transverse), ImageTrafo.Rot270
+            struct (ImageTrafo.Transpose, ImageTrafo.Identity), ImageTrafo.Transpose
+            struct (ImageTrafo.Transpose, ImageTrafo.Rot90), ImageTrafo.MirrorY
+            struct (ImageTrafo.Transpose, ImageTrafo.Rot180), ImageTrafo.Transverse
+            struct (ImageTrafo.Transpose, ImageTrafo.Rot270), ImageTrafo.MirrorX
+            struct (ImageTrafo.Transpose, ImageTrafo.MirrorX), ImageTrafo.Rot270
+            struct (ImageTrafo.Transpose, ImageTrafo.Transpose), ImageTrafo.Identity
+            struct (ImageTrafo.Transpose, ImageTrafo.MirrorY), ImageTrafo.Rot90
+            struct (ImageTrafo.Transpose, ImageTrafo.Transverse), ImageTrafo.Rot180
+            struct (ImageTrafo.MirrorY, ImageTrafo.Identity), ImageTrafo.MirrorY
+            struct (ImageTrafo.MirrorY, ImageTrafo.Rot90), ImageTrafo.Transverse
+            struct (ImageTrafo.MirrorY, ImageTrafo.Rot180), ImageTrafo.MirrorX
+            struct (ImageTrafo.MirrorY, ImageTrafo.Rot270), ImageTrafo.Transpose
+            struct (ImageTrafo.MirrorY, ImageTrafo.MirrorX), ImageTrafo.Rot180
+            struct (ImageTrafo.MirrorY, ImageTrafo.Transpose), ImageTrafo.Rot270
+            struct (ImageTrafo.MirrorY, ImageTrafo.MirrorY), ImageTrafo.Identity
+            struct (ImageTrafo.MirrorY, ImageTrafo.Transverse), ImageTrafo.Rot90
+            struct (ImageTrafo.Transverse, ImageTrafo.Identity), ImageTrafo.Transverse
+            struct (ImageTrafo.Transverse, ImageTrafo.Rot90), ImageTrafo.MirrorX
+            struct (ImageTrafo.Transverse, ImageTrafo.Rot180), ImageTrafo.Transpose
+            struct (ImageTrafo.Transverse, ImageTrafo.Rot270), ImageTrafo.MirrorY
+            struct (ImageTrafo.Transverse, ImageTrafo.MirrorX), ImageTrafo.Rot90
+            struct (ImageTrafo.Transverse, ImageTrafo.Transpose), ImageTrafo.Rot180
+            struct (ImageTrafo.Transverse, ImageTrafo.MirrorY), ImageTrafo.Rot270
+            struct (ImageTrafo.Transverse, ImageTrafo.Transverse), ImageTrafo.Identity
         ]
 
     let compose (l : ImageTrafo) (r : ImageTrafo) =
-        composeTable.[(l,r)]
+        composeTable (struct (l, r))
 
     let inverse =
         LookupTable.lookupTable [
diff --git a/src/Aardvark.Base.Tensors/PixImage/PixImageCube.fs b/src/Aardvark.Base.Tensors/PixImage/PixImageCube.fs
index 01455a6e..0b4eaf66 100644
--- a/src/Aardvark.Base.Tensors/PixImage/PixImageCube.fs
+++ b/src/Aardvark.Base.Tensors/PixImage/PixImageCube.fs
@@ -55,92 +55,6 @@ module FSharpPixImageCubeExtensions =
     module PixImageCube =
 
         module Trafo =
-            let private figureOutComposeOp () =
-
-                let v = Volume<byte>(V3i.III * 10)
-
-                let direct = Array.zeroCreate 8
-                for o0 in 0..7 do
-                    direct.[o0] <- v.Transformed(unbox o0).Info
-
-                for o0 in 0..7 do
-                    for o1 in 0..7 do
-                        let nv = v.Transformed(unbox o0).Transformed(unbox o1).Info
-
-                        let res = direct |> Array.findIndex (fun di -> di.Equals(nv))
-
-                        printfn "(ImageTrafo.%A, ImageTrafo.%A), ImageTrafo.%A" (unbox<ImageTrafo> o0) (unbox<ImageTrafo> o1) (unbox<ImageTrafo> res)
-
-            let private composeTable =
-                Dictionary.ofList [
-                    (ImageTrafo.Identity, ImageTrafo.Identity), ImageTrafo.Identity
-                    (ImageTrafo.Identity, ImageTrafo.Rot90), ImageTrafo.Rot90
-                    (ImageTrafo.Identity, ImageTrafo.Rot180), ImageTrafo.Rot180
-                    (ImageTrafo.Identity, ImageTrafo.Rot270), ImageTrafo.Rot270
-                    (ImageTrafo.Identity, ImageTrafo.MirrorX), ImageTrafo.MirrorX
-                    (ImageTrafo.Identity, ImageTrafo.Transpose), ImageTrafo.Transpose
-                    (ImageTrafo.Identity, ImageTrafo.MirrorY), ImageTrafo.MirrorY
-                    (ImageTrafo.Identity, ImageTrafo.Transverse), ImageTrafo.Transverse
-                    (ImageTrafo.Rot90, ImageTrafo.Identity), ImageTrafo.Rot90
-                    (ImageTrafo.Rot90, ImageTrafo.Rot90), ImageTrafo.Rot180
-                    (ImageTrafo.Rot90, ImageTrafo.Rot180), ImageTrafo.Rot270
-                    (ImageTrafo.Rot90, ImageTrafo.Rot270), ImageTrafo.Identity
-                    (ImageTrafo.Rot90, ImageTrafo.MirrorX), ImageTrafo.Transverse
-                    (ImageTrafo.Rot90, ImageTrafo.Transpose), ImageTrafo.MirrorX
-                    (ImageTrafo.Rot90, ImageTrafo.MirrorY), ImageTrafo.Transpose
-                    (ImageTrafo.Rot90, ImageTrafo.Transverse), ImageTrafo.MirrorY
-                    (ImageTrafo.Rot180, ImageTrafo.Identity), ImageTrafo.Rot180
-                    (ImageTrafo.Rot180, ImageTrafo.Rot90), ImageTrafo.Rot270
-                    (ImageTrafo.Rot180, ImageTrafo.Rot180), ImageTrafo.Identity
-                    (ImageTrafo.Rot180, ImageTrafo.Rot270), ImageTrafo.Rot90
-                    (ImageTrafo.Rot180, ImageTrafo.MirrorX), ImageTrafo.MirrorY
-                    (ImageTrafo.Rot180, ImageTrafo.Transpose), ImageTrafo.Transverse
-                    (ImageTrafo.Rot180, ImageTrafo.MirrorY), ImageTrafo.MirrorX
-                    (ImageTrafo.Rot180, ImageTrafo.Transverse), ImageTrafo.Transpose
-                    (ImageTrafo.Rot270, ImageTrafo.Identity), ImageTrafo.Rot270
-                    (ImageTrafo.Rot270, ImageTrafo.Rot90), ImageTrafo.Identity
-                    (ImageTrafo.Rot270, ImageTrafo.Rot180), ImageTrafo.Rot90
-                    (ImageTrafo.Rot270, ImageTrafo.Rot270), ImageTrafo.Rot180
-                    (ImageTrafo.Rot270, ImageTrafo.MirrorX), ImageTrafo.Transpose
-                    (ImageTrafo.Rot270, ImageTrafo.Transpose), ImageTrafo.MirrorY
-                    (ImageTrafo.Rot270, ImageTrafo.MirrorY), ImageTrafo.Transverse
-                    (ImageTrafo.Rot270, ImageTrafo.Transverse), ImageTrafo.MirrorX
-                    (ImageTrafo.MirrorX, ImageTrafo.Identity), ImageTrafo.MirrorX
-                    (ImageTrafo.MirrorX, ImageTrafo.Rot90), ImageTrafo.Transpose
-                    (ImageTrafo.MirrorX, ImageTrafo.Rot180), ImageTrafo.MirrorY
-                    (ImageTrafo.MirrorX, ImageTrafo.Rot270), ImageTrafo.Transverse
-                    (ImageTrafo.MirrorX, ImageTrafo.MirrorX), ImageTrafo.Identity
-                    (ImageTrafo.MirrorX, ImageTrafo.Transpose), ImageTrafo.Rot90
-                    (ImageTrafo.MirrorX, ImageTrafo.MirrorY), ImageTrafo.Rot180
-                    (ImageTrafo.MirrorX, ImageTrafo.Transverse), ImageTrafo.Rot270
-                    (ImageTrafo.Transpose, ImageTrafo.Identity), ImageTrafo.Transpose
-                    (ImageTrafo.Transpose, ImageTrafo.Rot90), ImageTrafo.MirrorY
-                    (ImageTrafo.Transpose, ImageTrafo.Rot180), ImageTrafo.Transverse
-                    (ImageTrafo.Transpose, ImageTrafo.Rot270), ImageTrafo.MirrorX
-                    (ImageTrafo.Transpose, ImageTrafo.MirrorX), ImageTrafo.Rot270
-                    (ImageTrafo.Transpose, ImageTrafo.Transpose), ImageTrafo.Identity
-                    (ImageTrafo.Transpose, ImageTrafo.MirrorY), ImageTrafo.Rot90
-                    (ImageTrafo.Transpose, ImageTrafo.Transverse), ImageTrafo.Rot180
-                    (ImageTrafo.MirrorY, ImageTrafo.Identity), ImageTrafo.MirrorY
-                    (ImageTrafo.MirrorY, ImageTrafo.Rot90), ImageTrafo.Transverse
-                    (ImageTrafo.MirrorY, ImageTrafo.Rot180), ImageTrafo.MirrorX
-                    (ImageTrafo.MirrorY, ImageTrafo.Rot270), ImageTrafo.Transpose
-                    (ImageTrafo.MirrorY, ImageTrafo.MirrorX), ImageTrafo.Rot180
-                    (ImageTrafo.MirrorY, ImageTrafo.Transpose), ImageTrafo.Rot270
-                    (ImageTrafo.MirrorY, ImageTrafo.MirrorY), ImageTrafo.Identity
-                    (ImageTrafo.MirrorY, ImageTrafo.Transverse), ImageTrafo.Rot90
-                    (ImageTrafo.Transverse, ImageTrafo.Identity), ImageTrafo.Transverse
-                    (ImageTrafo.Transverse, ImageTrafo.Rot90), ImageTrafo.MirrorX
-                    (ImageTrafo.Transverse, ImageTrafo.Rot180), ImageTrafo.Transpose
-                    (ImageTrafo.Transverse, ImageTrafo.Rot270), ImageTrafo.MirrorY
-                    (ImageTrafo.Transverse, ImageTrafo.MirrorX), ImageTrafo.Rot90
-                    (ImageTrafo.Transverse, ImageTrafo.Transpose), ImageTrafo.Rot180
-                    (ImageTrafo.Transverse, ImageTrafo.MirrorY), ImageTrafo.Rot270
-                    (ImageTrafo.Transverse, ImageTrafo.Transverse), ImageTrafo.Identity
-                ]
-
-            let private composeTrafo (l : ImageTrafo) (r : ImageTrafo) =
-                composeTable.[(l,r)]
 
             let private identity =
                 Map.ofList [
@@ -155,7 +69,7 @@ module FSharpPixImageCubeExtensions =
             let private compose (l : Map<CubeSide, CubeSide * ImageTrafo>) (r : Map<CubeSide, CubeSide * ImageTrafo>) : Map<CubeSide, CubeSide * ImageTrafo> =
                 l |> Map.map (fun s (ts, lt) ->
                     match Map.tryFind ts r with
-                        | Some (fs, rt) -> fs, composeTrafo lt rt
+                        | Some (fs, rt) -> fs, ImageTrafo.compose lt rt
                         | None -> ts, lt
                 )
 
diff --git a/src/Aardvark.Base.Tensors/PixImage/PixImageImageSharp.fs b/src/Aardvark.Base.Tensors/PixImage/PixImageImageSharp.fs
index b8fbcf97..556e6796 100644
--- a/src/Aardvark.Base.Tensors/PixImage/PixImageImageSharp.fs
+++ b/src/Aardvark.Base.Tensors/PixImage/PixImageImageSharp.fs
@@ -225,29 +225,9 @@ module private ImageSharpHelpers =
         )
         res
 
-    let getSize (trafo : ImageTrafo) (w : int) (h : int) =
-        match trafo with
-        | ImageTrafo.Transpose -> V2i(h, w)
-        | ImageTrafo.Transverse -> V2i(h, w)
-        | ImageTrafo.Rot90 -> V2i(h, w)
-        | ImageTrafo.Rot270 -> V2i(h, w)
-        | _ -> V2i(w,h)
-
     let usingTransformed<'T> (fmt : Col.Format) (w : int) (h : int) (trafo : ImageTrafo) (action : PixImage<'T> -> unit) =
-        let s = getSize trafo w h
-
-        let inv =
-            match trafo with
-            | ImageTrafo.Identity   -> ImageTrafo.Identity
-            | ImageTrafo.Rot90      -> ImageTrafo.Rot270
-            | ImageTrafo.Rot180     -> ImageTrafo.Rot180
-            | ImageTrafo.Rot270     -> ImageTrafo.Rot90
-            | ImageTrafo.MirrorX    -> ImageTrafo.MirrorX
-            | ImageTrafo.MirrorY    -> ImageTrafo.MirrorY
-            | ImageTrafo.Transpose  -> ImageTrafo.Transpose
-            | ImageTrafo.Transverse -> ImageTrafo.Transverse
-            | _ -> failwithf "bad image trafo: %A" trafo
-
+        let s = ImageTrafo.transformSize (V2i(w, h)) trafo
+        let inv = ImageTrafo.inverse trafo
         let img = PixImage<'T>(fmt, s)
         let local = unbox<PixImage<'T>>(img.Transformed inv)
         action local
@@ -507,7 +487,8 @@ and [<AbstractClass; Sealed; Extension>] PixImageSharp private() =
         try
             let info = Image.Identify stream
             let trafo = getImageTrafo info
-            PixImageInfo(PixFormat.ByteRGBA, getSize trafo info.Width info.Height)
+            let size = trafo |> ImageTrafo.transformSize (V2i(info.Width, info.Height))
+            PixImageInfo(PixFormat.ByteRGBA, size)
         with _ ->
             null
 
@@ -548,21 +529,9 @@ and [<AbstractClass; Sealed; Extension>] PixImageSharp private() =
                     | None ->
                         if make.ToLower().Contains "canon" then 1.6 else 1.5
 
-                let trafo = getImageTrafo info
-
-                let mutable size = V2i(info.Width, info.Height)
-                match trafo with
-                | ImageTrafo.Transpose
-                | ImageTrafo.Transverse
-                | ImageTrafo.Rot90
-                | ImageTrafo.Rot270 ->
-                    size <- V2i(size.Y, size.X)
-                | _ ->
-                    ()
-
                 try
                     return {
-                        size        = size
+                        size        = info |> getImageTrafo |> ImageTrafo.transformSize (V2i(info.Width, info.Height))
                         cropFactor  = crop
                         make        = make.Trim()
                         model       = model.Trim()