You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Tkinter水印图片保存报错TypeError:参数需str而非bytes求助

问题解决:保存带水印图片时的TypeError错误

错误原因

触发TypeError: write() argument must be str, not bytes的核心原因是:

  • 你用fd.asksaveasfile(mode='w')以文本模式打开文件,但PIL的Image.save()方法需要写入二进制数据,文本模式仅支持字符串写入,无法处理字节流,因此报错。

修复方案

以下两种方式均可解决问题,更推荐第二种:

方式一:修改文件打开模式为二进制写入

将asksaveasfile的mode参数改为'wb',让文件以二进制模式打开:

def save_picture(new_image):
    """Save watermarked picture"""
    filename = fd.asksaveasfile(mode='wb', defaultextension=".png", filetypes=(("PNG file", "*.png"), ("All Files", "*.*")))
    if not filename:
        return
    new_image.save(filename)
    filename.close()  # 手动关闭文件对象

方式二:使用asksaveasfilename获取文件路径(更简洁)

直接获取保存路径字符串,传递给save()方法,无需手动管理文件对象:

def save_picture(new_image):
    """Save watermarked picture"""
    file_path = fd.asksaveasfilename(defaultextension=".png", filetypes=(("PNG file", "*.png"), ("All Files", "*.*")))
    if not file_path:
        return
    new_image.save(file_path)

额外优化建议

  • 当前add_watermark函数直接修改原始image_obj,建议创建原图副本再加水印,避免破坏原图:
def add_watermark(image):
    global new_image_obj
    """Add watermark to the picture"""
    # 创建原图副本,避免修改原始图片
    new_image_obj = image.copy()
    width, height = new_image_obj.size
    draw = ImageDraw.Draw(new_image_obj)

    # 后续代码保持不变...
  • 给字体加载逻辑添加异常处理,避免系统缺少arial.ttf时崩溃:
try:
    font = ImageFont.truetype("arial.ttf", font_size)
except IOError:
    #  fallback到默认字体
    font = ImageFont.load_default()

内容的提问来源于stack exchange,提问作者Dziabak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 06:15:30