Pillow/Tests/test_format_hsv.py

132 lines
4.4 KiB
Python
Raw Normal View History

from .helper import PillowTestCase, hopper
2014-07-22 09:36:40 +04:00
from PIL import Image
2018-04-20 02:19:13 +03:00
from PIL._util import py3
2014-07-22 09:36:40 +04:00
2014-08-28 15:44:19 +04:00
import colorsys
import itertools
2014-07-22 09:36:40 +04:00
class TestFormatHSV(PillowTestCase):
def int_to_float(self, i):
return float(i)/255.0
2014-08-28 15:44:19 +04:00
2014-07-22 09:36:40 +04:00
def str_to_float(self, i):
return float(ord(i))/255.0
2014-08-28 15:44:19 +04:00
2014-07-23 19:49:19 +04:00
def tuple_to_ints(self, tp):
2014-08-28 15:44:19 +04:00
x, y, z = tp
2018-10-21 17:05:40 +03:00
return int(x*255.0), int(y*255.0), int(z*255.0)
2014-08-28 15:44:19 +04:00
2014-07-22 09:36:40 +04:00
def test_sanity(self):
2014-08-28 15:44:19 +04:00
Image.new('HSV', (100, 100))
2014-07-22 09:36:40 +04:00
def wedge(self):
2014-08-28 15:44:19 +04:00
w = Image._wedge()
2014-07-22 09:36:40 +04:00
w90 = w.rotate(90)
(px, h) = w.size
2014-08-28 15:44:19 +04:00
r = Image.new('L', (px*3, h))
2014-07-22 09:36:40 +04:00
g = r.copy()
b = r.copy()
2014-08-28 15:44:19 +04:00
r.paste(w, (0, 0))
r.paste(w90, (px, 0))
2014-07-22 09:36:40 +04:00
2014-08-28 15:44:19 +04:00
g.paste(w90, (0, 0))
g.paste(w, (2*px, 0))
2014-07-22 09:36:40 +04:00
2014-08-28 15:44:19 +04:00
b.paste(w, (px, 0))
b.paste(w90, (2*px, 0))
2014-07-22 09:36:40 +04:00
2014-08-28 15:44:19 +04:00
img = Image.merge('RGB', (r, g, b))
2014-07-22 09:36:40 +04:00
return img
2014-08-28 15:44:19 +04:00
2014-07-22 09:36:40 +04:00
def to_xxx_colorsys(self, im, func, mode):
# convert the hard way using the library colorsys routines.
2014-08-28 15:44:19 +04:00
(r, g, b) = im.split()
if py3:
2014-07-23 19:49:19 +04:00
conv_func = self.int_to_float
else:
conv_func = self.str_to_float
2014-07-22 09:36:40 +04:00
if hasattr(itertools, 'izip'):
iter_helper = itertools.izip
else:
iter_helper = itertools.zip_longest
2014-08-28 15:44:19 +04:00
converted = [self.tuple_to_ints(func(conv_func(_r), conv_func(_g),
conv_func(_b)))
for (_r, _g, _b) in iter_helper(r.tobytes(), g.tobytes(),
b.tobytes())]
2014-07-23 19:49:19 +04:00
if py3:
new_bytes = b''.join(bytes(chr(h)+chr(s)+chr(v), 'latin-1') for (
2014-08-28 15:44:19 +04:00
h, s, v) in converted)
else:
new_bytes = b''.join(chr(h)+chr(s)+chr(v) for (
2014-08-28 15:44:19 +04:00
h, s, v) in converted)
hsv = Image.frombytes(mode, r.size, new_bytes)
2014-07-22 09:36:40 +04:00
return hsv
def to_hsv_colorsys(self, im):
return self.to_xxx_colorsys(im, colorsys.rgb_to_hsv, 'HSV')
def to_rgb_colorsys(self, im):
return self.to_xxx_colorsys(im, colorsys.hsv_to_rgb, 'RGB')
def test_wedge(self):
2014-08-28 15:44:19 +04:00
src = self.wedge().resize((3*32, 32), Image.BILINEAR)
2014-07-23 19:49:19 +04:00
im = src.convert('HSV')
comparable = self.to_hsv_colorsys(src)
2014-07-22 09:36:40 +04:00
2017-08-09 02:36:07 +03:00
self.assert_image_similar(im.getchannel(0), comparable.getchannel(0),
2014-07-22 09:36:40 +04:00
1, "Hue conversion is wrong")
2017-08-09 02:36:07 +03:00
self.assert_image_similar(im.getchannel(1), comparable.getchannel(1),
2014-07-22 09:36:40 +04:00
1, "Saturation conversion is wrong")
2017-08-09 02:36:07 +03:00
self.assert_image_similar(im.getchannel(2), comparable.getchannel(2),
2014-07-22 09:36:40 +04:00
1, "Value conversion is wrong")
2014-07-23 19:49:19 +04:00
comparable = src
2014-07-22 09:36:40 +04:00
im = im.convert('RGB')
2017-08-09 02:36:07 +03:00
self.assert_image_similar(im.getchannel(0), comparable.getchannel(0),
2014-07-22 09:36:40 +04:00
3, "R conversion is wrong")
2017-08-09 02:36:07 +03:00
self.assert_image_similar(im.getchannel(1), comparable.getchannel(1),
2014-07-22 09:36:40 +04:00
3, "G conversion is wrong")
2017-08-09 02:36:07 +03:00
self.assert_image_similar(im.getchannel(2), comparable.getchannel(2),
2014-07-22 09:36:40 +04:00
3, "B conversion is wrong")
2014-08-28 15:44:19 +04:00
2014-07-22 09:36:40 +04:00
def test_convert(self):
im = hopper('RGB').convert('HSV')
comparable = self.to_hsv_colorsys(hopper('RGB'))
2014-07-22 09:36:40 +04:00
2017-08-09 02:36:07 +03:00
self.assert_image_similar(im.getchannel(0), comparable.getchannel(0),
2014-07-22 09:36:40 +04:00
1, "Hue conversion is wrong")
2017-08-09 02:36:07 +03:00
self.assert_image_similar(im.getchannel(1), comparable.getchannel(1),
2014-07-22 09:36:40 +04:00
1, "Saturation conversion is wrong")
2017-08-09 02:36:07 +03:00
self.assert_image_similar(im.getchannel(2), comparable.getchannel(2),
2014-07-22 09:36:40 +04:00
1, "Value conversion is wrong")
def test_hsv_to_rgb(self):
comparable = self.to_hsv_colorsys(hopper('RGB'))
2014-07-22 09:36:40 +04:00
converted = comparable.convert('RGB')
comparable = self.to_rgb_colorsys(comparable)
2017-08-09 02:36:07 +03:00
self.assert_image_similar(converted.getchannel(0),
comparable.getchannel(0),
2014-07-22 09:36:40 +04:00
3, "R conversion is wrong")
2017-08-09 02:36:07 +03:00
self.assert_image_similar(converted.getchannel(1),
comparable.getchannel(1),
2014-07-22 09:36:40 +04:00
3, "G conversion is wrong")
2017-08-09 02:36:07 +03:00
self.assert_image_similar(converted.getchannel(2),
comparable.getchannel(2),
2014-07-22 09:36:40 +04:00
3, "B conversion is wrong")