(ele: dict[str, str | Image.Image], size_factor: int = IMAGE_FACTOR)
| 82 | |
| 83 | |
| 84 | def fetch_image(ele: dict[str, str | Image.Image], size_factor: int = IMAGE_FACTOR) -> Image.Image: |
| 85 | if "image" in ele: |
| 86 | image = ele["image"] |
| 87 | else: |
| 88 | image = ele["image_url"] |
| 89 | image_obj = None |
| 90 | if isinstance(image, Image.Image): |
| 91 | image_obj = image |
| 92 | elif image.startswith("http://") or image.startswith("https://"): |
| 93 | image_obj = Image.open(requests.get(image, stream=True).raw) |
| 94 | elif image.startswith("file://"): |
| 95 | image_obj = Image.open(image[7:]) |
| 96 | elif image.startswith("data:image"): |
| 97 | if "base64," in image: |
| 98 | _, base64_data = image.split("base64,", 1) |
| 99 | data = base64.b64decode(base64_data) |
| 100 | image_obj = Image.open(BytesIO(data)) |
| 101 | else: |
| 102 | image_obj = Image.open(image) |
| 103 | if image_obj is None: |
| 104 | raise ValueError(f"Unrecognized image input, support local path, http url, base64 and PIL.Image, got {image}") |
| 105 | image = image_obj.convert("RGB") |
| 106 | ## resize |
| 107 | if "resized_height" in ele and "resized_width" in ele: |
| 108 | resized_height, resized_width = smart_resize( |
| 109 | ele["resized_height"], |
| 110 | ele["resized_width"], |
| 111 | factor=size_factor, |
| 112 | ) |
| 113 | else: |
| 114 | width, height = image.size |
| 115 | min_pixels = ele.get("min_pixels", MIN_PIXELS) |
| 116 | max_pixels = ele.get("max_pixels", MAX_PIXELS) |
| 117 | resized_height, resized_width = smart_resize( |
| 118 | height, |
| 119 | width, |
| 120 | factor=size_factor, |
| 121 | min_pixels=min_pixels, |
| 122 | max_pixels=max_pixels, |
| 123 | ) |
| 124 | image = image.resize((resized_width, resized_height)) |
| 125 | |
| 126 | return image |
| 127 | |
| 128 | |
| 129 | def smart_nframes( |
no test coverage detected