/pyface/ui/wx/util/tests/test_image_helpers.py

https://github.com/enthought/pyface · Python · 202 lines · 138 code · 56 blank · 8 comment · 2 complexity · c61de596478af6207cdbaee350e5c759 MD5 · raw file

  1. # Copyright (c) 2005-2022, Enthought Inc.
  2. # All rights reserved.
  3. #
  4. # This software is provided without warranty under the terms of the BSD
  5. # license included in LICENSE.txt and may be redistributed only
  6. # under the conditions described in the aforementioned license. The license
  7. # is also available online at http://www.enthought.com/licenses/BSD.txt
  8. # Thanks for using Enthought open source!
  9. import unittest
  10. import wx
  11. from traits.testing.optional_dependencies import numpy as np, requires_numpy
  12. from ..image_helpers import (
  13. bitmap_to_icon, bitmap_to_image, image_to_array, image_to_bitmap,
  14. array_to_image, AspectRatio, ScaleMode, resize_image, resize_bitmap,
  15. )
  16. class TestImageHelpers(unittest.TestCase):
  17. def test_image_to_bitmap(self):
  18. wximage = wx.Image(32, 64)
  19. wximage.SetRGB(wx.Rect(0, 0, 32, 64), 0x44, 0x88, 0xcc)
  20. wxbitmap = image_to_bitmap(wximage)
  21. self.assertIsInstance(wxbitmap, wx.Bitmap)
  22. def test_bitmap_to_image(self):
  23. wximage = wx.Image(32, 64)
  24. wximage.SetRGB(wx.Rect(0, 0, 32, 64), 0x44, 0x88, 0xcc)
  25. wxbitmap = wximage.ConvertToBitmap()
  26. wximage = bitmap_to_image(wxbitmap)
  27. self.assertIsInstance(wximage, wx.Image)
  28. def test_bitmap_to_icon(self):
  29. wximage = wx.Image(32, 64)
  30. wximage.SetRGB(wx.Rect(0, 0, 32, 64), 0x44, 0x88, 0xcc)
  31. wxbitmap = wximage.ConvertToBitmap()
  32. wximage = bitmap_to_icon(wxbitmap)
  33. self.assertIsInstance(wximage, wx.Icon)
  34. def test_resize_image(self):
  35. wximage = wx.Image(32, 64)
  36. wximage.SetRGB(wx.Rect(0, 0, 32, 64), 0x44, 0x88, 0xcc)
  37. wximage = resize_image(wximage, (128, 128))
  38. self.assertIsInstance(wximage, wx.Image)
  39. self.assertEqual(wximage.GetWidth(), 128)
  40. self.assertEqual(wximage.GetHeight(), 128)
  41. def test_resize_image_smooth(self):
  42. wximage = wx.Image(32, 64)
  43. wximage.SetRGB(wx.Rect(0, 0, 32, 64), 0x44, 0x88, 0xcc)
  44. wximage = resize_image(wximage, (128, 128), mode=ScaleMode.smooth)
  45. self.assertIsInstance(wximage, wx.Image)
  46. self.assertEqual(wximage.GetWidth(), 128)
  47. self.assertEqual(wximage.GetHeight(), 128)
  48. def test_resize_image_constrain(self):
  49. wximage = wx.Image(32, 64)
  50. wximage.SetRGB(wx.Rect(0, 0, 32, 64), 0x44, 0x88, 0xcc)
  51. wximage = resize_image(wximage, (128, 128), AspectRatio.keep_constrain)
  52. self.assertIsInstance(wximage, wx.Image)
  53. self.assertEqual(wximage.GetWidth(), 64)
  54. self.assertEqual(wximage.GetHeight(), 128)
  55. def test_resize_image_expand(self):
  56. wximage = wx.Image(32, 64)
  57. wximage.SetRGB(wx.Rect(0, 0, 32, 64), 0x44, 0x88, 0xcc)
  58. wximage = resize_image(wximage, (128, 128), AspectRatio.keep_expand)
  59. self.assertIsInstance(wximage, wx.Image)
  60. self.assertEqual(wximage.GetWidth(), 128)
  61. self.assertEqual(wximage.GetHeight(), 256)
  62. def test_resize_bitmap(self):
  63. wximage = wx.Image(32, 64)
  64. wximage.SetRGB(wx.Rect(0, 0, 32, 64), 0x44, 0x88, 0xcc)
  65. wxbitmap = wximage.ConvertToBitmap()
  66. wxbitmap = resize_bitmap(wxbitmap, (128, 128))
  67. self.assertIsInstance(wxbitmap, wx.Bitmap)
  68. self.assertEqual(wxbitmap.GetWidth(), 128)
  69. self.assertEqual(wxbitmap.GetHeight(), 128)
  70. def test_resize_bitmap_smooth(self):
  71. wximage = wx.Image(32, 64)
  72. wximage.SetRGB(wx.Rect(0, 0, 32, 64), 0x44, 0x88, 0xcc)
  73. wxbitmap = wximage.ConvertToBitmap()
  74. wxbitmap = resize_bitmap(wxbitmap, (128, 128), mode=ScaleMode.smooth)
  75. self.assertIsInstance(wxbitmap, wx.Bitmap)
  76. self.assertEqual(wxbitmap.GetWidth(), 128)
  77. self.assertEqual(wxbitmap.GetHeight(), 128)
  78. def test_resize_bitmap_constrain(self):
  79. wximage = wx.Image(32, 64)
  80. wximage.SetRGB(wx.Rect(0, 0, 32, 64), 0x44, 0x88, 0xcc)
  81. wxbitmap = wximage.ConvertToBitmap()
  82. wxbitmap = resize_bitmap(wxbitmap, (128, 128), AspectRatio.keep_constrain)
  83. self.assertIsInstance(wxbitmap, wx.Bitmap)
  84. self.assertEqual(wxbitmap.GetWidth(), 64)
  85. self.assertEqual(wxbitmap.GetHeight(), 128)
  86. def test_resize_bitmap_expand(self):
  87. wximage = wx.Image(32, 64)
  88. wximage.SetRGB(wx.Rect(0, 0, 32, 64), 0x44, 0x88, 0xcc)
  89. wxbitmap = wximage.ConvertToBitmap()
  90. wxbitmap = resize_bitmap(wxbitmap, (128, 128), AspectRatio.keep_expand)
  91. self.assertIsInstance(wxbitmap, wx.Bitmap)
  92. self.assertEqual(wxbitmap.GetWidth(), 128)
  93. self.assertEqual(wxbitmap.GetHeight(), 256)
  94. @requires_numpy
  95. class TestArrayImageHelpers(unittest.TestCase):
  96. def test_image_to_array_rgb(self):
  97. wximage = wx.Image(32, 64)
  98. wximage.SetRGB(wx.Rect(0, 0, 32, 64), 0x44, 0x88, 0xcc)
  99. array = image_to_array(wximage)
  100. self.assertEqual(array.shape, (32, 64, 4))
  101. self.assertEqual(array.dtype, np.dtype('uint8'))
  102. self.assertTrue(np.all(array[:, :, 3] == 0xff))
  103. self.assertTrue(np.all(array[:, :, 0] == 0x44))
  104. self.assertTrue(np.all(array[:, :, 1] == 0x88))
  105. self.assertTrue(np.all(array[:, :, 2] == 0xcc))
  106. def test_image_to_array_rgba(self):
  107. wximage = wx.Image(32, 64)
  108. wximage.SetRGB(wx.Rect(0, 0, 32, 64), 0x44, 0x88, 0xcc)
  109. wximage.InitAlpha()
  110. wximage.SetAlpha(np.full((32*64,), 0xee, dtype='uint8'))
  111. array = image_to_array(wximage)
  112. self.assertEqual(array.shape, (32, 64, 4))
  113. self.assertEqual(array.dtype, np.dtype('uint8'))
  114. self.assertTrue(np.all(array[:, :, 0] == 0x44))
  115. self.assertTrue(np.all(array[:, :, 1] == 0x88))
  116. self.assertTrue(np.all(array[:, :, 2] == 0xcc))
  117. self.assertTrue(np.all(array[:, :, 3] == 0xee))
  118. def test_array_to_image_rgb(self):
  119. array = np.empty((64, 32, 3), dtype='uint8')
  120. array[:, :, 0] = 0x44
  121. array[:, :, 1] = 0x88
  122. array[:, :, 2] = 0xcc
  123. wximage = array_to_image(array)
  124. self.assertEqual(wximage.GetWidth(), 32)
  125. self.assertEqual(wximage.GetHeight(), 64)
  126. self.assertFalse(wximage.HasAlpha())
  127. def test_array_to_image_rgba(self):
  128. array = np.empty((64, 32, 4), dtype='uint8')
  129. array[:, :, 0] = 0x44
  130. array[:, :, 1] = 0x88
  131. array[:, :, 2] = 0xcc
  132. array[:, :, 3] = 0xee
  133. wximage = array_to_image(array)
  134. self.assertEqual(wximage.GetWidth(), 32)
  135. self.assertEqual(wximage.GetHeight(), 64)
  136. self.assertTrue(wximage.HasAlpha())
  137. def test_array_to_image_bad_channels(self):
  138. array = np.empty((64, 32, 2), dtype='uint8')
  139. array[:, :, 0] = 0x44
  140. array[:, :, 1] = 0x88
  141. with self.assertRaises(ValueError):
  142. array_to_image(array)
  143. def test_array_to_image_bad_ndim(self):
  144. array = np.full((64, 32), 0x44, dtype='uint8')
  145. with self.assertRaises(ValueError):
  146. array_to_image(array)