|
|
import gradio as gr |
|
|
from pathlib import Path |
|
|
from PIL import Image |
|
|
|
|
|
def get_supported_formats(): |
|
|
""" |
|
|
A function that retrieves the supported formats of images. |
|
|
Returns: |
|
|
The supported image formats as a list. |
|
|
""" |
|
|
supported_formats = Image.registered_extensions() |
|
|
return supported_formats |
|
|
|
|
|
|
|
|
SUPPORTED_FORMATS = get_supported_formats() |
|
|
|
|
|
|
|
|
def convert_format( |
|
|
input_image: str = None, ext: str = ".webp", quality: int = 80 |
|
|
): |
|
|
""" |
|
|
A function that converts an input image to a specified format with a given quality. |
|
|
|
|
|
Parameters: |
|
|
input_image (str): The path to the input image file. |
|
|
ext (str, optional): The extension for the output format. Defaults to ".webp". |
|
|
quality (int, optional): The quality of the output image. Defaults to 80. |
|
|
|
|
|
Returns: |
|
|
tuple: A tuple containing the reopened image in RGBA format and the path to the saved image file. |
|
|
""" |
|
|
file_path = Path("caches") / "{}{}".format(Path(input_image).stem, ext) |
|
|
file_path.parent.mkdir(parents=True, exist_ok=True) |
|
|
img = Image.open(input_image) |
|
|
|
|
|
format = None |
|
|
if ext in SUPPORTED_FORMATS: |
|
|
format = SUPPORTED_FORMATS[ext] |
|
|
if format is None: |
|
|
gr.Error( |
|
|
"Unsupported image format. Supported formats: {}".format( |
|
|
", ".join(SUPPORTED_FORMATS) |
|
|
) |
|
|
) |
|
|
img.save(file_path, format, quality=quality) |
|
|
|
|
|
|
|
|
img_reopen = Image.open(file_path) |
|
|
img_reopen = img_reopen.convert("RGBA") |
|
|
return img_reopen, str(file_path) |
|
|
|
|
|
|
|
|
def process(input_list: list[tuple], ext: str = ".webp", quality: int = 80): |
|
|
""" |
|
|
A function that processes a list of images by converting them to a specified format with a given quality. |
|
|
|
|
|
Parameters: |
|
|
input_list (list[tuple]): A list of tuples containing the paths to the input image files. |
|
|
ext (str, optional): The extension for the output format. Defaults to ".webp". |
|
|
quality (int, optional): The quality of the output images. Defaults to 80. |
|
|
|
|
|
Returns: |
|
|
tuple: A tuple containing lists of file paths and reopened images in RGBA format. |
|
|
""" |
|
|
out_files = [] |
|
|
out_images = [] |
|
|
for path in input_list: |
|
|
img_reopen, file_path = convert_format(path[0], ext, quality) |
|
|
out_files.append(file_path) |
|
|
out_images.append(img_reopen) |
|
|
return out_files, out_images |
|
|
|
|
|
|
|
|
def swap_to_gallery(images: list): |
|
|
""" |
|
|
A function that swaps to a gallery, taking a list of images as input. |
|
|
""" |
|
|
return ( |
|
|
gr.update(value=images, visible=True), |
|
|
gr.update(visible=True), |
|
|
gr.update(visible=False), |
|
|
) |
|
|
|
|
|
|
|
|
def run(server_name: str = "127.0.0.1", server_port: int = 7860): |
|
|
""" |
|
|
A function that runs the WebP Converter app, allowing users to upload images, set quality, and convert them to WebP format. |
|
|
|
|
|
Parameters: |
|
|
server_name (str, optional): The server name where the app is hosted. Defaults to "127.0.0.1". |
|
|
server_port (int, optional): The port number for the server. Defaults to 7860. |
|
|
|
|
|
Returns: |
|
|
None |
|
|
""" |
|
|
with gr.Blocks() as app: |
|
|
gr.Markdown( |
|
|
""" |
|
|
# Image Format Converter |
|
|
Upload one or more image files and convert it to specified format with adjustable quality. |
|
|
""" |
|
|
) |
|
|
|
|
|
with gr.Row(equal_height=False): |
|
|
with gr.Column(): |
|
|
files = gr.Files( |
|
|
label="Drag 1 or more images", |
|
|
file_types=["image"], |
|
|
) |
|
|
uploaded_files = gr.Gallery( |
|
|
label="Your images", visible=False, columns=4, height="auto" |
|
|
) |
|
|
with gr.Row(): |
|
|
quality_slider = gr.Slider( |
|
|
minimum=1, |
|
|
maximum=100, |
|
|
value=80, |
|
|
step=1, |
|
|
label="Image Quality", |
|
|
) |
|
|
extension_dropdown = gr.Dropdown( |
|
|
label="Output Format", |
|
|
choices=[ |
|
|
".bmp", |
|
|
".gif", |
|
|
".png", |
|
|
".tif", |
|
|
".tiff", |
|
|
".webp", |
|
|
], |
|
|
value=".webp", |
|
|
) |
|
|
with gr.Row(): |
|
|
reset_btn = gr.Button("Clear Images", variant="secondary") |
|
|
proc_btn = gr.Button("Run Convert", variant="primary") |
|
|
|
|
|
with gr.Column(): |
|
|
output_file = gr.File(label="Converted WebP") |
|
|
output_gallery = gr.Gallery( |
|
|
label="Re-check converted images", |
|
|
show_label=False, |
|
|
elem_id="gallery", |
|
|
object_fit="contain", |
|
|
height="auto", |
|
|
columns=4, |
|
|
) |
|
|
|
|
|
|
|
|
inputs = [ |
|
|
uploaded_files, |
|
|
extension_dropdown, |
|
|
quality_slider, |
|
|
] |
|
|
outputs = [ |
|
|
output_file, |
|
|
output_gallery, |
|
|
] |
|
|
|
|
|
|
|
|
files.upload( |
|
|
fn=swap_to_gallery, |
|
|
inputs=files, |
|
|
outputs=[uploaded_files, proc_btn, files], |
|
|
) |
|
|
proc_btn.click(process, inputs=inputs, outputs=outputs) |
|
|
reset_btn.click(lambda: None, None, uploaded_files, queue=False) |
|
|
app.queue().launch( |
|
|
server_name=server_name, server_port=server_port, share=False |
|
|
) |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
run(server_name="0.0.0.0", server_port=7860) |
|
|
|