images_test.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. package imageproc
  2. import (
  3. "image"
  4. "reflect"
  5. "testing"
  6. )
  7. func testEq(a, b any) bool {
  8. va := reflect.ValueOf(a)
  9. vb := reflect.ValueOf(b)
  10. if va.Kind() != reflect.Slice || vb.Kind() != reflect.Slice {
  11. return false
  12. }
  13. if va.Len() != vb.Len() {
  14. return false
  15. }
  16. for i := range va.Len() {
  17. if !reflect.DeepEqual(va.Index(i).Interface(), vb.Index(i).Interface()) {
  18. return false
  19. }
  20. }
  21. return true
  22. }
  23. func TestAspectRatios(t *testing.T) {
  24. type AspectCase struct {
  25. MaxTiles int
  26. Expected []image.Point
  27. }
  28. cases := []AspectCase{
  29. {
  30. MaxTiles: 1,
  31. Expected: []image.Point{{1, 1}},
  32. },
  33. {
  34. MaxTiles: 2,
  35. Expected: []image.Point{{1, 1}, {1, 2}, {2, 1}},
  36. },
  37. {
  38. MaxTiles: 3,
  39. Expected: []image.Point{{1, 1}, {1, 2}, {1, 3}, {2, 1}, {3, 1}},
  40. },
  41. {
  42. MaxTiles: 4,
  43. Expected: []image.Point{{1, 1}, {1, 2}, {1, 3}, {1, 4}, {2, 1}, {2, 2}, {3, 1}, {4, 1}},
  44. },
  45. }
  46. for _, c := range cases {
  47. actual := GetSupportedAspectRatios(c.MaxTiles)
  48. if !testEq(actual, c.Expected) {
  49. t.Errorf("incorrect aspect ratio: '%#v'. expected: '%#v'", actual, c.Expected)
  50. }
  51. }
  52. }
  53. func TestGetImageSizeFitToCanvas(t *testing.T) {
  54. type ImageSizeCase struct {
  55. ImageRect image.Point
  56. CanvasRect image.Point
  57. TileSize int
  58. Expected image.Point
  59. }
  60. cases := []ImageSizeCase{
  61. {
  62. ImageRect: image.Point{400, 400},
  63. CanvasRect: image.Point{640, 480},
  64. TileSize: 200,
  65. Expected: image.Point{400, 400},
  66. },
  67. {
  68. ImageRect: image.Point{1024, 768},
  69. CanvasRect: image.Point{640, 480},
  70. TileSize: 200,
  71. Expected: image.Point{640, 480},
  72. },
  73. {
  74. ImageRect: image.Point{500, 500},
  75. CanvasRect: image.Point{1000, 1000},
  76. TileSize: 750,
  77. Expected: image.Point{750, 750},
  78. },
  79. {
  80. ImageRect: image.Point{500, 1000},
  81. CanvasRect: image.Point{2000, 2000},
  82. TileSize: 2000,
  83. Expected: image.Point{1000, 2000},
  84. },
  85. {
  86. ImageRect: image.Point{4000, 3000},
  87. CanvasRect: image.Point{2000, 1000},
  88. TileSize: 1000,
  89. Expected: image.Point{1333, 1000},
  90. },
  91. {
  92. ImageRect: image.Point{667, 1000},
  93. CanvasRect: image.Point{1000, 1000},
  94. TileSize: 560,
  95. Expected: image.Point{667, 1000},
  96. },
  97. }
  98. for _, c := range cases {
  99. actual := GetImageSizeFitToCanvas(c.ImageRect, c.CanvasRect, c.TileSize)
  100. if actual != c.Expected {
  101. t.Errorf("incorrect image rect: '%#v'. expected: '%#v'", actual, c.Expected)
  102. }
  103. }
  104. }
  105. func TestGetOptimalTiledCanvas(t *testing.T) {
  106. type TiledCanvasSizeCase struct {
  107. ImageSize image.Point
  108. MaxImageTiles int
  109. TileSize int
  110. Expected image.Point
  111. }
  112. cases := []TiledCanvasSizeCase{
  113. {
  114. ImageSize: image.Point{1024, 768},
  115. MaxImageTiles: 4,
  116. TileSize: 1000,
  117. Expected: image.Point{4000, 1000},
  118. },
  119. {
  120. ImageSize: image.Point{1024, 768},
  121. MaxImageTiles: 4,
  122. TileSize: 560,
  123. Expected: image.Point{1120, 1120},
  124. },
  125. }
  126. for _, c := range cases {
  127. actual := GetOptimalTiledCanvas(c.ImageSize, c.MaxImageTiles, c.TileSize)
  128. if actual != c.Expected {
  129. t.Errorf("incorrect tiled canvas: '%#v'. expected: '%#v'", actual, c.Expected)
  130. }
  131. }
  132. }
  133. func TestSplitToTiles(t *testing.T) {
  134. type SplitCase struct {
  135. TestImage image.Image
  136. NumTilesSize image.Point
  137. Expected []image.Image
  138. }
  139. cases := []SplitCase{
  140. {
  141. TestImage: image.NewRGBA(image.Rect(0, 0, 1024, 768)),
  142. NumTilesSize: image.Point{1, 1},
  143. Expected: []image.Image{image.NewRGBA(image.Rect(0, 0, 1024, 768))},
  144. },
  145. {
  146. TestImage: image.NewRGBA(image.Rect(0, 0, 1000, 500)),
  147. NumTilesSize: image.Point{2, 1},
  148. Expected: []image.Image{
  149. image.NewRGBA(image.Rect(0, 0, 500, 500)),
  150. image.NewRGBA(image.Rect(500, 0, 1000, 500)),
  151. },
  152. },
  153. {
  154. TestImage: image.NewRGBA(image.Rect(0, 0, 1000, 1000)),
  155. NumTilesSize: image.Point{2, 2},
  156. Expected: []image.Image{
  157. image.NewRGBA(image.Rect(0, 0, 500, 500)),
  158. image.NewRGBA(image.Rect(500, 0, 1000, 500)),
  159. image.NewRGBA(image.Rect(0, 500, 500, 1000)),
  160. image.NewRGBA(image.Rect(500, 500, 1000, 1000)),
  161. },
  162. },
  163. }
  164. for _, c := range cases {
  165. actual := SplitToTiles(c.TestImage, c.NumTilesSize)
  166. if len(actual) != len(c.Expected) {
  167. t.Errorf("incorrect number of images '%d': expected: '%d'", len(actual), len(c.Expected))
  168. }
  169. for i := range actual {
  170. if actual[i].Bounds() != c.Expected[i].Bounds() {
  171. t.Errorf("image size incorrect: '%#v': expected: '%#v'", actual[i].Bounds(), c.Expected[i].Bounds())
  172. }
  173. }
  174. }
  175. }
  176. func TestResize(t *testing.T) {
  177. type ResizeCase struct {
  178. TestImage image.Image
  179. OutputSize image.Point
  180. MaxImageTiles int
  181. ExpectedImage image.Image
  182. ExpectedAspectRatio image.Point
  183. }
  184. cases := []ResizeCase{
  185. {
  186. TestImage: image.NewRGBA(image.Rect(0, 0, 200, 200)),
  187. OutputSize: image.Point{100, 100},
  188. MaxImageTiles: 1,
  189. ExpectedImage: image.NewRGBA(image.Rect(0, 0, 100, 100)),
  190. ExpectedAspectRatio: image.Point{1, 1},
  191. },
  192. {
  193. TestImage: image.NewRGBA(image.Rect(0, 0, 200, 200)),
  194. OutputSize: image.Point{100, 100},
  195. MaxImageTiles: 2,
  196. ExpectedImage: image.NewRGBA(image.Rect(0, 0, 100, 100)),
  197. ExpectedAspectRatio: image.Point{1, 2},
  198. },
  199. {
  200. TestImage: image.NewRGBA(image.Rect(0, 0, 2560, 1920)),
  201. OutputSize: image.Point{560, 560},
  202. MaxImageTiles: 4,
  203. ExpectedImage: image.NewRGBA(image.Rect(0, 0, 1120, 840)),
  204. ExpectedAspectRatio: image.Point{2, 2},
  205. },
  206. {
  207. TestImage: image.NewRGBA(image.Rect(0, 0, 1024, 768)),
  208. OutputSize: image.Point{560, 560},
  209. MaxImageTiles: 4,
  210. ExpectedImage: image.NewRGBA(image.Rect(0, 0, 1024, 768)),
  211. ExpectedAspectRatio: image.Point{2, 2},
  212. },
  213. }
  214. for _, c := range cases {
  215. actualImage, actualAspectRatio := ResizeImage(c.TestImage, c.OutputSize, c.MaxImageTiles)
  216. if actualImage.Bounds() != c.ExpectedImage.Bounds() {
  217. t.Errorf("image size incorrect: '%#v': expected: '%#v'", actualImage.Bounds(), c.ExpectedImage.Bounds())
  218. }
  219. if actualAspectRatio != c.ExpectedAspectRatio {
  220. t.Errorf("canvas size incorrect: '%#v': expected: '%#v'", actualAspectRatio, c.ExpectedAspectRatio)
  221. }
  222. }
  223. }
  224. func TestPad(t *testing.T) {
  225. type PadCase struct {
  226. TestImage image.Image
  227. OutputSize image.Point
  228. AspectRatio image.Point
  229. Expected image.Image
  230. }
  231. cases := []PadCase{
  232. {
  233. TestImage: image.NewRGBA(image.Rect(0, 0, 1000, 667)),
  234. OutputSize: image.Point{560, 560},
  235. AspectRatio: image.Point{2, 2},
  236. Expected: image.NewRGBA(image.Rect(0, 0, 1120, 1120)),
  237. },
  238. }
  239. for _, c := range cases {
  240. actual := PadImage(c.TestImage, c.OutputSize, c.AspectRatio)
  241. if actual.Bounds() != c.Expected.Bounds() {
  242. t.Errorf("image size incorrect: '%#v': expected: '%#v'", actual.Bounds(), c.Expected.Bounds())
  243. }
  244. }
  245. }
  246. func TestPackImages(t *testing.T) {
  247. type PackCase struct {
  248. TestImage image.Image
  249. AspectRatio image.Point
  250. }
  251. mean := [3]float32{0.48145466, 0.4578275, 0.40821073}
  252. std := [3]float32{0.26862954, 0.26130258, 0.27577711}
  253. cases := []PackCase{
  254. {
  255. TestImage: image.NewRGBA(image.Rect(0, 0, 1120, 1120)),
  256. AspectRatio: image.Point{2, 2},
  257. },
  258. {
  259. TestImage: image.NewRGBA(image.Rect(0, 0, 560, 560)),
  260. AspectRatio: image.Point{1, 1},
  261. },
  262. {
  263. TestImage: image.NewRGBA(image.Rect(0, 0, 1120, 560)),
  264. AspectRatio: image.Point{1, 2},
  265. },
  266. }
  267. for _, c := range cases {
  268. PackImages(c.TestImage, c.AspectRatio, mean, std)
  269. }
  270. }