5.7练习“打台球”

返回逐浪字库
5回复贴,共1页,点击数:43

“是这种调查还是全球范围的,那他们因该知道,其中的两人与‘科学边界’没有任何来往,包括——杨东。”丁仪说出这个名字时显的很吃力。
“丁仪,你知道,我现在也卷进这件事里了。所以,关于杨东做出这选择的原因,我也很想知道,我想你一定知道一些。”汪淼笨拙地说道,试图掩盖他真正的心迹。
“如果知道了,你会卷的更社深。现在你只是人和事卷进来了,知道后连精神也会卷进来,那就麻烦大了”
“我是搞应用研究的,没你们理论派那么敏感。”
“那好吧,打过台球吗”丁仪走到台球桌前。
“上学时随便玩过几下”
“我和她喜欢打,因为这让我们想到了加速器中的粒子碰撞,丁仪说着黑白两球,将黑球放到洞旁,将白球放到距离黑球十厘米左右是位置问汪淼,能打进去吗?
“当然”
“打吧”
汪淼轻松将球打入洞中。
丁仪示意“搬”两人再次抬起台球桌,搬到客厅是第三角,丁仪将黑白两球摆放到同样的位置,“打吧”
“我说,我们……打吧”
汪淼无奈是笑了笑,第三次将黑球打入洞中。
他们又搬了两次球桌,一次搬到客厅靠门的一角,最后一次搬回了原位。丁仪又两次将黑球摆到洞前的位置,汪淼两次将黑球击入洞内,这时两人都有些出汗了。

1楼 2026/05/07 08:21

需求

当前目录下有多个jpg文件,图片规格相同,都是2584*1828px大小。
同时还有一个四角透明的mask.png,规格为1836*1032px

推荐一个类库,用python或powershell方法,实现png图片对其它jpg图片的覆盖,最终输出透明png
首先是将2584*1828px大小的jpg,先将它强制变更1800*1264px大小,
接下来在jpg图片上覆盖规格为mask.png,二者以中心对齐,输出透明png图,保留原mask.png的四角透明。
最后输出的图片为原Jpg图片名_user.png,如原图片为:封面.png,输出为:封面_user.png
注意:要求最后输出图片四角透明。
2楼 2026/05/08 06:43 收起回复

一次实现:

import os
from PIL import Image

def process_images():
    # 基础配置
    mask_path = 'mask.png'
    target_size = (1800, 1264)

    # 检查 mask 是否存在
    if not os.path.exists(mask_path):
        print(f"错误: 找不到 {mask_path}")
        return

    # 加载 mask 并确保是 RGBA 模式以保留透明度
    mask_img = Image.open(mask_path).convert("RGBA")
    m_width, m_height = mask_img.size

    # 遍历当前目录
    for filename in os.listdir('.'):
        if filename.lower().endswith(".jpg"):
            print(f"正在处理: {filename}")

            # 1. 打开 JPG 并强制缩放
            with Image.open(filename) as jpg_img:
                # 转换为 RGBA 方便后续透明合成
                jpg_resized = jpg_img.resize(target_size, Image.LANCZOS).convert("RGBA")

                # 2. 计算居中对齐坐标
                # 公式: (大图宽 - 小图宽) // 2
                x = (target_size[0] - m_width) // 2
                y = (target_size[1] - m_height) // 2

                # 3. 创建一个新的透明底图,大小与缩放后的 JPG 一致
                # 关键:这步保证了如果 mask 四角透明,底图也是透明的
                output_canvas = Image.new("RGBA", target_size, (0, 0, 0, 0))

                # 先把 jpg 画在底图上
                output_canvas.paste(jpg_resized, (0, 0))

                # 再把 mask 覆盖上去
                # mask_img 作为第三个参数传入表示使用它自身的 alpha 通道作为遮罩
                output_canvas.paste(mask_img, (x, y), mask_img)

                # 4. 生成文件名并保存
                base_name = os.path.splitext(filename)[0]
                output_canvas.save(f"{base_name}_user.png", "PNG")

    print("处理完成!")

if __name__ == "__main__":
    process_images()
3楼 2026/05/08 07:13 收起回复

打包EXE代码:

import os
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image

def process_images():
    # 初始化 Tkinter 并隐藏主窗口
    root = tk.Tk()
    root.withdraw()

    # 1. 弹出对话框选择 mask.png 文件
    mask_path = filedialog.askopenfilename(
        title="第一步:请选择你的 mask.png 文件",
        filetypes=[("PNG图片", "*.png")]
    )
    if not mask_path:
        return

    # 2. 弹出对话框选择 JPG 图片所在的目录
    folder_path = filedialog.askdirectory(title="第二步:请选择包含 JPG 图片的文件夹")
    if not folder_path:
        return

    target_size = (1800, 1264)

    try:
        # 加载 mask 并确保是 RGBA 模式
        mask_img = Image.open(mask_path).convert("RGBA")
        m_width, m_height = mask_img.size

        processed_count = 0

        # 遍历目标目录
        for filename in os.listdir(folder_path):
            if filename.lower().endswith(".jpg"):
                full_path = os.path.join(folder_path, filename)

                with Image.open(full_path) as jpg_img:
                    # A. 将 JPG 强制缩放为 1800 * 1264
                    # Image.LANCZOS 保证了缩放后的图片质量
                    jpg_resized = jpg_img.resize(target_size, Image.Resampling.LANCZOS).convert("RGBA")

                    # B. 创建一个全透明的底板 (1800 * 1264)
                    # 这一步是确保“四角透明”的关键,如果 mask 没盖住的地方就是全透明
                    output_canvas = Image.new("RGBA", target_size, (0, 0, 0, 0))
                    output_canvas.paste(jpg_resized, (0, 0))

                    # C. 计算居中对齐坐标并覆盖 mask
                    x = (target_size[0] - m_width) // 2
                    y = (target_size[1] - m_height) // 2

                    # 第三参数传入 mask_img 自身作为 Alpha 遮罩
                    output_canvas.paste(mask_img, (x, y), mask_img)

                    # D. 导出为 PNG
                    base_name = os.path.splitext(filename)[0]
                    save_path = os.path.join(folder_path, f"{base_name}_user.png")
                    output_canvas.save(save_path, "PNG")
                    processed_count += 1

        messagebox.showinfo("处理成功", f"任务完成!\n处理文件夹:{folder_path}\n生成图片数量:{processed_count}")

    except Exception as e:
        messagebox.showerror("程序错误", f"处理过程中发生异常:\n{str(e)}")

if __name__ == "__main__":
    process_images()

打包命令:
第二步:执行打包命令
将上面的代码保存为 process_tool.py,然后在该文件所在的目录下运行:

pyinstaller --onefile --noconsole process_tool.py
pyinstaller --onefile --noconsole --name "图片合成工具" --clean your_script_name.py

—onefile: 将所有库文件打包进一个单独的 .exe 中。

—noconsole: 运行时不弹出黑色的命令行窗口(适合有 GUI 的程序)。

4楼 2026/05/08 07:16 收起回复

45px角度透明

import os
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageDraw

def create_rounded_mask(size, radius):
    """创建一个圆角矩形遮罩"""
    mask = Image.new("L", size, 0)
    draw = ImageDraw.Draw(mask)
    # 绘制白色的圆角矩形
    draw.rounded_rectangle((0, 0) + size, radius=radius, fill=255)
    return mask

def process_images():
    root = tk.Tk()
    root.withdraw()

    # 1. 选择 mask.png 文件
    mask_path = filedialog.askopenfilename(
        title="第一步:请选择你的 mask.png 文件",
        filetypes=[("PNG images", "*.png")]
    )
    if not mask_path:
        return

    # 2. 选择包含 JPG 的目录
    folder_path = filedialog.askdirectory(title="第二步:请选择包含待处理 JPG 图片的文件夹")
    if not folder_path:
        return

    target_size = (1800, 1264)
    corner_radius = 45  # 设定的 45px 曲率

    try:
        mask_img = Image.open(mask_path).convert("RGBA")[cite: 1]
        m_width, m_height = mask_img.size

        # 预先生成一个 45px 的圆角遮罩
        rounded_mask = create_rounded_mask(target_size, corner_radius)

        processed_count = 0
        for filename in os.listdir(folder_path):
            if filename.lower().endswith(".jpg"):
                full_path = os.path.join(folder_path, filename)

                with Image.open(full_path) as jpg_img:
                    # A. 强制缩放 JPG
                    jpg_resized = jpg_img.resize(target_size, Image.Resampling.LANCZOS).convert("RGBA")

                    # B. 关键步骤:应用圆角裁剪
                    # 将圆角遮罩应用到缩放后的 JPG 的 Alpha 通道上
                    jpg_resized.putalpha(rounded_mask)

                    # C. 创建全透明底板[cite: 1]
                    output_canvas = Image.new("RGBA", target_size, (0, 0, 0, 0))

                    # D. 粘贴已经变成圆角的 JPG
                    output_canvas.paste(jpg_resized, (0, 0), jpg_resized)

                    # E. 覆盖 mask.png[cite: 1]
                    x = (target_size[0] - m_width) // 2
                    y = (target_size[1] - m_height) // 2
                    output_canvas.paste(mask_img, (x, y), mask_img)

                    # F. 保存[cite: 1]
                    base_name = os.path.splitext(filename)[0]
                    save_path = os.path.join(folder_path, f"{base_name}_user.png")
                    output_canvas.save(save_path, "PNG")
                    processed_count += 1

        messagebox.showinfo("成功", f"处理完成!\n共生成 {processed_count} 张圆角透明图片。")

    except Exception as e:
        messagebox.showerror("错误", f"运行出错:\n{str(e)}")

if __name__ == "__main__":
    process_images()
5楼 2026/05/08 07:20 收起回复

cite报错:

import os
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image, ImageDraw

def create_rounded_mask(size, radius):
    """创建一个圆角矩形遮罩"""
    mask = Image.new("L", size, 0)
    draw = ImageDraw.Draw(mask)
    # 绘制白色的圆角矩形,radius 是圆角半径
    draw.rounded_rectangle((0, 0) + size, radius=radius, fill=255)
    return mask

def process_images():
    # 初始化 Tkinter 并隐藏主窗口
    root = tk.Tk()
    root.withdraw()

    # 1. 弹出对话框选择 mask.png 文件
    mask_path = filedialog.askopenfilename(
        title="第一步:请选择你的 mask.png 文件",
        filetypes=[("PNG图片", "*.png")]
    )
    if not mask_path:
        return

    # 2. 弹出对话框选择 JPG 图片所在的目录
    folder_path = filedialog.askdirectory(title="第二步:请选择包含 JPG 图片的文件夹")
    if not folder_path:
        return

    target_size = (1800, 1264)
    corner_radius = 45  # 45px 的圆角曲率

    try:
        # 加载 mask
        mask_img = Image.open(mask_path).convert("RGBA")
        m_width, m_height = mask_img.size

        # 预先生成一个 45px 的圆角遮罩
        rounded_mask = create_rounded_mask(target_size, corner_radius)

        processed_count = 0

        # 遍历目录
        for filename in os.listdir(folder_path):
            if filename.lower().endswith(".jpg"):
                full_path = os.path.join(folder_path, filename)

                with Image.open(full_path) as jpg_img:
                    # A. 强制缩放 JPG
                    jpg_resized = jpg_img.resize(target_size, Image.Resampling.LANCZOS).convert("RGBA")

                    # B. 给 JPG 应用圆角透明遮罩
                    # 这一步会把 JPG 的四个角切掉变成透明
                    jpg_resized.putalpha(rounded_mask)

                    # C. 创建一个全透明的底板
                    output_canvas = Image.new("RGBA", target_size, (0, 0, 0, 0))

                    # D. 先贴上带圆角的 JPG
                    output_canvas.paste(jpg_resized, (0, 0), jpg_resized)

                    # E. 再居中覆盖 mask.png
                    x = (target_size[0] - m_width) // 2
                    y = (target_size[1] - m_height) // 2
                    output_canvas.paste(mask_img, (x, y), mask_img)

                    # F. 保存为 PNG
                    base_name = os.path.splitext(filename)[0]
                    save_path = os.path.join(folder_path, f"{base_name}_user.png")
                    output_canvas.save(save_path, "PNG")
                    processed_count += 1

        messagebox.showinfo("成功", f"处理完成!\n共生成 {processed_count} 张圆角透明图片。")

    except Exception as e:
        messagebox.showerror("程序错误", f"发生异常:\n{str(e)}")

if __name__ == "__main__":
    process_images()
6楼 2026/05/08 07:24 收起回复
您未登录,没有发贴权限[点此登录]