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() # Get all registered image extensions and their formats print("Supported formats retrieved:", supported_formats) 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. """ print("Converting image:", input_image, "to format:", ext, "with quality:", quality) file_path = Path("caches") / "{}{}".format(Path(input_image).stem, ext) # Generate output file path print("Output file path generated:", file_path) file_path.parent.mkdir(parents=True, exist_ok=True) # Create directories if they don't exist img = Image.open(input_image) # Open the input image print("Image opened successfully.") format = None print("Checking if extension is supported:", ext) # Log the extension being checked if ext in SUPPORTED_FORMATS: # Check if the specified extension is supported format = SUPPORTED_FORMATS[ext] if format is None: # If format is not supported, raise an error error_message = "Unsupported image format. Supported formats: {}".format( ", ".join(SUPPORTED_FORMATS) ) print(error_message) gr.Error(error_message) img.save(file_path, format, quality=quality) # Save the image in the specified format and quality print("Image saved to:", file_path) # Reopen the saved image to verify its integrity img_reopen = Image.open(file_path) img_reopen = img_reopen.convert("RGBA") # Ensure the image is in RGBA format print("Image reopened and converted to RGBA format.") 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. """ print("Processing images with extension:", ext, "and quality:", quality) out_files = [] # List to store paths of converted images out_images = [] # List to store reopened images for index, path in enumerate(input_list): print(f"Processing image {index + 1}/{len(input_list)}: {path[0]}") # Include index for debugging batches img_reopen, file_path = convert_format(path[0], ext, quality) # Convert each image out_files.append(file_path) # Append the file path to the output list out_images.append(img_reopen) # Append the reopened image to the output list print("Image processed successfully.") print("All images processed. Output files:", out_files) 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. Parameters: images (list): List of images to display in the gallery. Returns: Updated gallery state. """ print("Swapping to gallery with images:", images) return ( gr.update(value=images, visible=True), # Update the gallery with new images gr.update(visible=True), # Make the gallery visible gr.update(visible=False), # Hide the file upload button ) 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 """ print("Starting the WebP Converter app on {}:{}".format(server_name, server_port)) with gr.Blocks(theme="Nymbo/Nymbo_Theme") as app: # Define the Gradio app layout gr.Markdown( """
Upload one or more image files and convert it to specified format with adjustable quality.