gradio/test/components/test_annotated_image.py
Hannah bf6bbd971a
Add min/max-imize button to gr.Image and gr.Gallery (#8964)
* add max/min-imize and zoom in and out to image preview

* add full screen icon to gallery

* add stories

* add changeset

* use native full screen api

* remove zoom in/out

* add changeset

* tweaks

* remove zoom prop

* fix ui test

* add annotated image btns

* add changeset

* format

* ruff format

* fix test

* remove

* tweak

* fix test

* format

* amend bool check

---------

Co-authored-by: gradio-pr-bot <gradio-pr-bot@users.noreply.github.com>
Co-authored-by: pngwn <hello@pngwn.io>
2024-08-05 23:45:14 +01:00

80 lines
2.9 KiB
Python

import numpy as np
import PIL
import gradio as gr
class TestAnnotatedImage:
def test_postprocess(self):
"""
postprocess
"""
component = gr.AnnotatedImage()
img = np.random.randint(0, 255, (100, 100, 3), dtype=np.uint8)
mask1 = [40, 40, 50, 50]
mask2 = np.zeros((100, 100), dtype=np.uint8)
mask2[10:20, 10:20] = 1
input = (img, [(mask1, "mask1"), (mask2, "mask2")])
assert (result := component.postprocess(input))
result = result.model_dump()
base_img_out = PIL.Image.open(result["image"]["path"]) # type: ignore
assert result["annotations"][0]["label"] == "mask1"
mask1_img_out = PIL.Image.open(result["annotations"][0]["image"]["path"]) # type: ignore
assert mask1_img_out.size == base_img_out.size
mask1_array_out = np.array(mask1_img_out)
assert np.max(mask1_array_out[40:50, 40:50]) == 255
assert np.max(mask1_array_out[50:60, 50:60]) == 0
def test_annotated_image_format_parameter(self):
component = gr.AnnotatedImage(format="jpeg")
img = np.random.randint(0, 255, (100, 100, 3), dtype=np.uint8)
mask1 = (40, 40, 50, 50)
data = (img, [(mask1, "mask1"), (mask1, "mask2")])
assert (output := component.postprocess(data))
assert output.image.path.endswith(".jpeg")
assert output.annotations[0].image.path.endswith(".png")
def test_component_functions(self):
ht_output = gr.AnnotatedImage(label="sections", show_legend=False)
assert ht_output.get_config() == {
"name": "annotatedimage",
"show_label": True,
"label": "sections",
"show_legend": False,
"container": True,
"min_width": 160,
"scale": None,
"format": "webp",
"color_map": None,
"height": None,
"width": None,
"elem_id": None,
"elem_classes": [],
"visible": True,
"value": None,
"proxy_url": None,
"_selectable": False,
"key": None,
"show_fullscreen_button": True,
}
def test_in_interface(self):
def mask(img):
top_left_corner = [0, 0, 20, 20]
random_mask = np.random.randint(0, 2, img.shape[:2])
return (img, [(top_left_corner, "left corner"), (random_mask, "random")])
iface = gr.Interface(mask, "image", gr.AnnotatedImage())
output = iface("test/test_files/bus.png")
output_img, (mask1, _) = output["image"], output["annotations"]
input_img = PIL.Image.open("test/test_files/bus.png") # type: ignore
output_img = PIL.Image.open(output_img) # type: ignore
mask1_img = PIL.Image.open(mask1["image"]) # type: ignore
assert output_img.size == input_img.size
assert mask1_img.size == input_img.size