登录
首页 >  文章 >  python教程

图像处理脚本:PNG转换器和resizer

时间:2025-02-16 19:19:15 418浏览 收藏

各位小伙伴们,大家好呀!看看今天我又给各位带来了什么文章?本文标题《图像处理脚本:PNG转换器和resizer》,很明显是关于文章的文章哈哈哈,其中内容主要会涉及到等等,如果能帮到你,觉得很不错的话,欢迎各位多多点评和分享!

This Python script automates image processing, ensuring transparency, cropping unused space, resizing to fit a 2:1 canvas, and cleaning filenames. Let's improve the clarity and structure for better understanding and maintainability.

图像处理脚本:PNG转换器和resizer

Image Processing Script: PNG Converter and Resizer

This Python script streamlines image processing by ensuring transparency, cropping excess space, resizing to a 2:1 aspect ratio, and standardizing filenames. Here's a breakdown of its functionality:

  • Transparency Handling: Converts images to PNG format with transparency. If an image has a white background, it's replaced with transparency.
  • Space Removal: Removes spaces from filenames, replacing them with underscores (_).
  • Filename Shortening: Truncates filenames exceeding a maximum length (30 characters).
  • Cropping: Crops any extra unused space around the image.
  • Resizing: Resizes images to fit a 2:1 canvas (e.g., 400x200), maintaining aspect ratio and centering the image.
  • Logging Skipped Images: Records filenames of images skipped due to unsupported formats, emptiness, or full transparency.
  • Dependencies: Requires the Pillow (PIL fork) library. Install it using: pip install Pillow

How to Use:

  1. Place your images in a folder (e.g., images).
  2. Run the script. It will process the images and save them to a new folder (e.g., edited_images).
  3. Processed images will be resized, centered, and saved as PNGs with transparency.

Notes:

The script handles only valid image formats and logs any issues with unsupported formats or transparency in the console.

Improved Python Script:

from PIL import Image
import os

def ensure_transparency(image):
    """Ensures the image has transparency; replaces white backgrounds with transparency."""
    if image.mode != 'RGBA':
        image = image.convert('RGBA')
    if image.getchannel('A').getextrema()[0] != 0:
        data = image.getdata()
        new_data = [(r, g, b, 0) if r > 240 and g > 240 and b > 240 else (r, g, b, a) for r, g, b, a in data]
        image.putdata(new_data)
    return image

def crop_and_resize(image, target_width, target_height):
    """Crops unused space and resizes to the target dimensions, maintaining aspect ratio."""
    bbox = image.getbbox()
    if bbox is None:
        return None  # Image is empty or fully transparent

    cropped = image.crop(bbox)
    width, height = cropped.size
    aspect_ratio = target_width / target_height

    if width / height > aspect_ratio:
        new_width = target_width
        new_height = int(new_width * (height / width))
    else:
        new_height = target_height
        new_width = int(new_height * (width / height))

    resized = cropped.resize((new_width, new_height), Image.LANCZOS)
    return resized

def process_image(input_path, output_path, target_width, target_height):
    """Processes a single image: ensures transparency, crops, resizes, and saves."""
    try:
        image = Image.open(input_path)
        image = ensure_transparency(image)
        resized_image = crop_and_resize(image, target_width, target_height)
        if resized_image:
            canvas = Image.new("RGBA", (target_width, target_height), (255, 255, 255, 0))
            x_offset = (target_width - resized_image.width) // 2
            y_offset = (target_height - resized_image.height) // 2
            canvas.paste(resized_image, (x_offset, y_offset))
            canvas.save(output_path, "PNG")
            return True
        else:
            return False
    except IOError:
        print(f"Error processing {input_path}")
        return False

def shorten_filename(filename, max_length=30):
    """Shortens filenames, preserving extensions."""
    name, ext = os.path.splitext(filename)
    return f"{name[:max_length]}{ext}"

def batch_process_images(input_dir, output_dir, target_width, target_height):
    """Processes all images in the input directory."""
    os.makedirs(output_dir, exist_ok=True)
    skipped = []
    for filename in os.listdir(input_dir):
        if filename.lower().endswith(('.jpg', '.jpeg', '.png')):
            input_path = os.path.join(input_dir, filename)
            new_filename = shorten_filename(filename.replace(" ", "_"))
            output_path = os.path.join(output_dir, new_filename)
            if not process_image(input_path, output_path, target_width, target_height):
                skipped.append(filename)
    if skipped:
        print("\nSkipped images:")
        for filename in skipped:
            print(f"- {filename}")


input_directory = './images'
output_directory = './edited_images'
batch_process_images(input_directory, output_directory, 400, 200) #Example 2:1 ratio

This revised script is more efficient, readable, and uses more descriptive variable names and function names. Error handling is improved, and the code is better organized into logical functions. Remember to create the images directory and place your images inside before running the script.

今天关于《图像处理脚本:PNG转换器和resizer》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>