resize_test.go 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. package imaging
  2. import (
  3. "image"
  4. "testing"
  5. )
  6. func TestResize(t *testing.T) {
  7. td := []struct {
  8. desc string
  9. src image.Image
  10. w, h int
  11. f ResampleFilter
  12. want *image.NRGBA
  13. }{
  14. {
  15. "Resize 2x2 1x1 box",
  16. &image.NRGBA{
  17. Rect: image.Rect(-1, -1, 1, 1),
  18. Stride: 2 * 4,
  19. Pix: []uint8{
  20. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  21. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  22. },
  23. },
  24. 1, 1,
  25. Box,
  26. &image.NRGBA{
  27. Rect: image.Rect(0, 0, 1, 1),
  28. Stride: 1 * 4,
  29. Pix: []uint8{0x40, 0x40, 0x40, 0xc0},
  30. },
  31. },
  32. {
  33. "Resize 2x2 2x2 box",
  34. &image.NRGBA{
  35. Rect: image.Rect(-1, -1, 1, 1),
  36. Stride: 2 * 4,
  37. Pix: []uint8{
  38. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  39. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  40. },
  41. },
  42. 2, 2,
  43. Box,
  44. &image.NRGBA{
  45. Rect: image.Rect(0, 0, 2, 2),
  46. Stride: 2 * 4,
  47. Pix: []uint8{
  48. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  49. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  50. },
  51. },
  52. },
  53. {
  54. "Resize 3x1 1x1 nearest",
  55. &image.NRGBA{
  56. Rect: image.Rect(-1, -1, 2, 0),
  57. Stride: 3 * 4,
  58. Pix: []uint8{
  59. 0xff, 0x00, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  60. },
  61. },
  62. 1, 1,
  63. NearestNeighbor,
  64. &image.NRGBA{
  65. Rect: image.Rect(0, 0, 1, 1),
  66. Stride: 1 * 4,
  67. Pix: []uint8{0x00, 0xff, 0x00, 0xff},
  68. },
  69. },
  70. {
  71. "Resize 2x2 0x4 box",
  72. &image.NRGBA{
  73. Rect: image.Rect(-1, -1, 1, 1),
  74. Stride: 2 * 4,
  75. Pix: []uint8{
  76. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  77. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  78. },
  79. },
  80. 0, 4,
  81. Box,
  82. &image.NRGBA{
  83. Rect: image.Rect(0, 0, 4, 4),
  84. Stride: 4 * 4,
  85. Pix: []uint8{
  86. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
  87. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
  88. 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
  89. 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff,
  90. },
  91. },
  92. },
  93. {
  94. "Resize 2x2 4x0 linear",
  95. &image.NRGBA{
  96. Rect: image.Rect(-1, -1, 1, 1),
  97. Stride: 2 * 4,
  98. Pix: []uint8{
  99. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  100. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  101. },
  102. },
  103. 4, 0,
  104. Linear,
  105. &image.NRGBA{
  106. Rect: image.Rect(0, 0, 4, 4),
  107. Stride: 4 * 4,
  108. Pix: []uint8{
  109. 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0xbf, 0x00, 0x00, 0xbf, 0xff, 0x00, 0x00, 0xff,
  110. 0x00, 0x40, 0x00, 0x40, 0x30, 0x30, 0x10, 0x70, 0x8f, 0x10, 0x30, 0xcf, 0xbf, 0x00, 0x40, 0xff,
  111. 0x00, 0xbf, 0x00, 0xbf, 0x10, 0x8f, 0x30, 0xcf, 0x30, 0x30, 0x8f, 0xef, 0x40, 0x00, 0xbf, 0xff,
  112. 0x00, 0xff, 0x00, 0xff, 0x00, 0xbf, 0x40, 0xff, 0x00, 0x40, 0xbf, 0xff, 0x00, 0x00, 0xff, 0xff,
  113. },
  114. },
  115. },
  116. }
  117. for _, d := range td {
  118. got := Resize(d.src, d.w, d.h, d.f)
  119. want := d.want
  120. if !compareNRGBA(got, want, 1) {
  121. t.Errorf("test [%s] failed: %#v", d.desc, got)
  122. }
  123. }
  124. }
  125. func TestFit(t *testing.T) {
  126. td := []struct {
  127. desc string
  128. src image.Image
  129. w, h int
  130. f ResampleFilter
  131. want *image.NRGBA
  132. }{
  133. {
  134. "Fit 2x2 1x10 box",
  135. &image.NRGBA{
  136. Rect: image.Rect(-1, -1, 1, 1),
  137. Stride: 2 * 4,
  138. Pix: []uint8{
  139. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  140. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  141. },
  142. },
  143. 1, 10,
  144. Box,
  145. &image.NRGBA{
  146. Rect: image.Rect(0, 0, 1, 1),
  147. Stride: 1 * 4,
  148. Pix: []uint8{0x40, 0x40, 0x40, 0xc0},
  149. },
  150. },
  151. {
  152. "Fit 2x2 10x1 box",
  153. &image.NRGBA{
  154. Rect: image.Rect(-1, -1, 1, 1),
  155. Stride: 2 * 4,
  156. Pix: []uint8{
  157. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  158. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  159. },
  160. },
  161. 10, 1,
  162. Box,
  163. &image.NRGBA{
  164. Rect: image.Rect(0, 0, 1, 1),
  165. Stride: 1 * 4,
  166. Pix: []uint8{0x40, 0x40, 0x40, 0xc0},
  167. },
  168. },
  169. {
  170. "Fit 2x2 10x10 box",
  171. &image.NRGBA{
  172. Rect: image.Rect(-1, -1, 1, 1),
  173. Stride: 2 * 4,
  174. Pix: []uint8{
  175. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  176. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  177. },
  178. },
  179. 10, 10,
  180. Box,
  181. &image.NRGBA{
  182. Rect: image.Rect(0, 0, 2, 2),
  183. Stride: 2 * 4,
  184. Pix: []uint8{
  185. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  186. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  187. },
  188. },
  189. },
  190. }
  191. for _, d := range td {
  192. got := Fit(d.src, d.w, d.h, d.f)
  193. want := d.want
  194. if !compareNRGBA(got, want, 0) {
  195. t.Errorf("test [%s] failed: %#v", d.desc, got)
  196. }
  197. }
  198. }
  199. func TestThumbnail(t *testing.T) {
  200. td := []struct {
  201. desc string
  202. src image.Image
  203. w, h int
  204. f ResampleFilter
  205. want *image.NRGBA
  206. }{
  207. {
  208. "Thumbnail 6x2 1x1 box",
  209. &image.NRGBA{
  210. Rect: image.Rect(-1, -1, 5, 1),
  211. Stride: 6 * 4,
  212. Pix: []uint8{
  213. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  214. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  215. },
  216. },
  217. 1, 1,
  218. Box,
  219. &image.NRGBA{
  220. Rect: image.Rect(0, 0, 1, 1),
  221. Stride: 1 * 4,
  222. Pix: []uint8{0x40, 0x40, 0x40, 0xc0},
  223. },
  224. },
  225. {
  226. "Thumbnail 2x6 1x1 box",
  227. &image.NRGBA{
  228. Rect: image.Rect(-1, -1, 1, 5),
  229. Stride: 2 * 4,
  230. Pix: []uint8{
  231. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  232. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  233. 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff,
  234. 0x00, 0xff, 0x00, 0xff, 0x00, 0x00, 0xff, 0xff,
  235. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  236. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  237. },
  238. },
  239. 1, 1,
  240. Box,
  241. &image.NRGBA{
  242. Rect: image.Rect(0, 0, 1, 1),
  243. Stride: 1 * 4,
  244. Pix: []uint8{0x40, 0x40, 0x40, 0xc0},
  245. },
  246. },
  247. {
  248. "Thumbnail 1x3 2x2 box",
  249. &image.NRGBA{
  250. Rect: image.Rect(-1, -1, 0, 2),
  251. Stride: 1 * 4,
  252. Pix: []uint8{
  253. 0x00, 0x00, 0x00, 0x00,
  254. 0xff, 0x00, 0x00, 0xff,
  255. 0xff, 0xff, 0xff, 0xff,
  256. },
  257. },
  258. 2, 2,
  259. Box,
  260. &image.NRGBA{
  261. Rect: image.Rect(0, 0, 2, 2),
  262. Stride: 2 * 4,
  263. Pix: []uint8{
  264. 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
  265. 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff,
  266. },
  267. },
  268. },
  269. }
  270. for _, d := range td {
  271. got := Thumbnail(d.src, d.w, d.h, d.f)
  272. want := d.want
  273. if !compareNRGBA(got, want, 0) {
  274. t.Errorf("test [%s] failed: %#v", d.desc, got)
  275. }
  276. }
  277. }