Revision 543:4190387a07c4
Added by Daniel Havlik almost 8 years ago
- ID 4190387a07c4
- Parent 542:a5e137061797
- Child 544:e6f81d7c26db
src/gocept/selenium/screenshot.py | ||
---|---|---|
14 | 14 |
return pkg_resources.resource_filename('gocept.selenium', resource) |
15 | 15 |
|
16 | 16 |
|
17 |
def image_diff_composition(exp, got): |
|
18 |
exp = exp.convert('RGB') |
|
19 |
got = got.convert('RGB') |
|
20 |
exp_txt = Image.open(get_path('exp_txt.png')) |
|
21 |
got_txt = Image.open(get_path('got_txt.png')) |
|
22 |
diff_txt = Image.open(get_path('diff_txt.png')) |
|
23 |
mask = Image.new('L', exp.size, 127) |
|
24 |
compo = Image.new('RGBA', (exp.size[0], exp.size[1]*3+60), (255,255,255,0)) |
|
25 |
compo.paste(exp_txt, (5,0)) |
|
26 |
compo.paste(exp, (0,20)) |
|
27 |
got_pos = (0, exp.size[1]+40) |
|
28 |
got_txt_pos = (5, exp.size[1]+20) |
|
29 |
diff_pos = (0, exp.size[1]*2+60) |
|
30 |
diff_txt_pos = (5, exp.size[1]*2+40) |
|
31 |
compo.paste(got_txt, got_txt_pos) |
|
32 |
compo.paste(got, got_pos) |
|
33 |
compo.paste(diff_txt, diff_txt_pos) |
|
34 |
missing_red = ImageChops.invert( |
|
35 |
ImageChops.subtract(got, exp)).point( |
|
36 |
lambda i: 0 if i!=255 else 255).convert('1').convert( |
|
37 |
'RGB').split()[0] |
|
38 |
missing_red_mask = missing_red.point(lambda i: 80 if i!=255 else 255) |
|
39 |
missing_empty = Image.new('L', missing_red.size, 255) |
|
40 |
missing_r = Image.merge( |
|
41 |
'RGB', (missing_empty, missing_red, missing_red)).convert('RGBA') |
|
42 |
missing_green = ImageChops.invert( |
|
43 |
ImageChops.subtract(exp, got)).point( |
|
44 |
lambda i: 0 if i!=255 else 255).convert('1').convert( |
|
45 |
'RGB').split()[0] |
|
46 |
missing_green_mask = missing_green.point(lambda i: 80 if i!=255 else 255) |
|
47 |
missing_g = Image.merge( |
|
48 |
'RGB', (missing_green, missing_empty, missing_green)).convert('RGBA') |
|
17 |
WHITE = (255, 255, 255, 0) |
|
49 | 18 |
|
50 |
exp.paste(got, exp.getbbox(), mask) |
|
51 |
exp.paste(missing_r, exp.getbbox(), ImageChops.invert(missing_red_mask)) |
|
52 |
exp.paste(missing_g, exp.getbbox(), ImageChops.invert(missing_green_mask)) |
|
53 |
compo.paste(exp, diff_pos) |
|
54 |
return compo |
|
19 |
|
|
20 |
class DiffComposition(object): |
|
21 |
|
|
22 |
label_margin = 20 |
|
23 |
|
|
24 |
def __init__(self, exp, got): |
|
25 |
self.exp = exp.convert('RGB') |
|
26 |
self.got = got.convert('RGB') |
|
27 |
self.width = self.exp.size[0] |
|
28 |
self.height = self.exp.size[1] |
|
29 |
self.prepare_composition() |
|
30 |
|
|
31 |
def prepare_composition(self): |
|
32 |
"""prepares and returns the composition image, given width |
|
33 |
and height is the size of one of the three images""" |
|
34 |
#load the images with the labels |
|
35 |
exp_txt = Image.open(get_path('exp_txt.png')) |
|
36 |
got_txt = Image.open(get_path('got_txt.png')) |
|
37 |
diff_txt = Image.open(get_path('diff_txt.png')) |
|
38 |
#create emtpy image |
|
39 |
compo_size = (self.width, 3*(self.height+self.label_margin)) |
|
40 |
self.compo = Image.new('RGBA', compo_size, WHITE) |
|
41 |
#paste the labels onto it |
|
42 |
for index, img in enumerate((exp_txt, got_txt, diff_txt)): |
|
43 |
pos = (5, index*(self.height+self.label_margin)) |
|
44 |
self.compo.paste(img, pos) |
|
45 |
|
|
46 |
|
|
47 |
def paste_screenshots(self): |
|
48 |
for index, screenshot in enumerate((self.exp, self.got, self.diff)): |
|
49 |
pos = (0, (index*self.height)+((index+1)*self.label_margin)) |
|
50 |
self.compo.paste(screenshot, pos) |
|
51 |
|
|
52 |
@property |
|
53 |
def composition(self): |
|
54 |
self.paste_screenshots() |
|
55 |
return self.compo |
|
56 |
|
|
57 |
@property |
|
58 |
def diff(self): |
|
59 |
def subtract(source, sub): |
|
60 |
return ImageChops.invert( |
|
61 |
ImageChops.subtract(source, sub)).point( |
|
62 |
lambda i: 0 if i!=255 else 255).convert('1').convert( |
|
63 |
'RGB').split()[0] |
|
64 |
def paste(dest, bbox, channels, merged): |
|
65 |
mask = channels.point(lambda i: 80 if i!=255 else 255) |
|
66 |
dest.paste(merged, bbox, ImageChops.invert(mask)) |
|
67 |
missing_red = subtract(self.got, self.exp) |
|
68 |
missing_green = subtract(self.exp, self.got) |
|
69 |
missing_empty = Image.new('L', missing_red.size, 255) |
|
70 |
missing_red_merged = Image.merge( |
|
71 |
'RGB', |
|
72 |
(missing_empty, missing_red, missing_red)).convert('RGBA') |
|
73 |
missing_green_merged = Image.merge( |
|
74 |
'RGB', |
|
75 |
(missing_green, missing_empty, missing_green)).convert('RGBA') |
|
76 |
diff = self.exp.copy() |
|
77 |
exp_bbox = diff.getbbox() |
|
78 |
mask = Image.new('L', (self.width, self.height), 127) |
|
79 |
diff.paste(self.got, exp_bbox, mask) |
|
80 |
paste(diff, exp_bbox, missing_red, missing_red_merged) |
|
81 |
paste(diff, exp_bbox, missing_green, missing_green_merged) |
|
82 |
return diff |
|
55 | 83 |
|
56 | 84 |
|
57 | 85 |
class ImageDiff(object): |
... | ... | |
176 | 204 |
return |
177 | 205 |
ignored, compo_path = tempfile.mkstemp('.png') |
178 | 206 |
with open(compo_path, 'rw') as compo: |
179 |
compo_img = image_diff_composition(image, screenshot)
|
|
207 |
compo_img = DiffComposition(image, screenshot).composition
|
|
180 | 208 |
compo_img.save(compo.name) |
181 | 209 |
if SHOW_DIFF_IMG: |
182 | 210 |
compo_img.show() |
Also available in: Unified diff
re #12065 refactor image diff composition code