unpack_from requires a buffer of at least 4 bytes for unpacking 4 bytes at offse...

2025年12月17日 12:10 状态: processing

🚨 错误信息

Traceback (most recent call last): File "/opt/anaconda3/envs/google/lib/python3.12/site-packages/PIL/ImageFile.py", line 374, in load s = read(read_bytes) ^^^^^^^^^^^^^^^^ File "/opt/anaconda3/envs/google/lib/python3.12/site-packages/PIL/PngImagePlugin.py", line 996, in load_read cid, pos, length = self.png.read() ^^^^^^^^^^^^^^^ File "/opt/anaconda3/envs/google/lib/python3.12/site-packages/PIL/PngImagePlugin.py", line 178, in read length = i32(s) ^^^^^^ File "/opt/anaconda3/envs/google/lib/python3.12/site-packages/PIL/_binary.py", line 95, in i32be return unpack_from(">I", c, o)[0] ^^^^^^^^^^^^^^^^^^^^^^^ struct.error: unpack_from requires a buffer of at least 4 bytes for unpacking 4 bytes at offset 0 (actual buffer size is 0) The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/Users/beihua/Code/gemini/draw.py", line 43, in <module> response = client.models.generate_content( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/envs/google/lib/python3.12/site-packages/google/genai/models.py", line 5230, in generate_content response = self._generate_content( ^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/envs/google/lib/python3.12/site-packages/google/genai/models.py", line 3988, in _generate_content request_dict = _GenerateContentParameters_to_mldev( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/envs/google/lib/python3.12/site-packages/google/genai/models.py", line 1306, in _GenerateContentParameters_to_mldev for item in t.t_contents(getv(from_object, ['contents'])) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/envs/google/lib/python3.12/site-packages/google/genai/_transformers.py", line 608, in t_contents _handle_current_part(result, accumulated_parts, content) File "/opt/anaconda3/envs/google/lib/python3.12/site-packages/google/genai/_transformers.py", line 586, in _handle_current_part current_part = t_part(current_part) ^^^^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/envs/google/lib/python3.12/site-packages/google/genai/_transformers.py", line 418, in t_part return types.Part(inline_data=pil_to_blob(part)) ^^^^^^^^^^^^^^^^^ File "/opt/anaconda3/envs/google/lib/python3.12/site-packages/google/genai/_transformers.py", line 303, in pil_to_blob img.save(bytesio, format='PNG') File "/opt/anaconda3/envs/google/lib/python3.12/site-packages/PIL/Image.py", line 2539, in save self.load() File "/opt/anaconda3/envs/google/lib/python3.12/site-packages/PIL/ImageFile.py", line 381, in load raise OSError(msg) from e OSError: image file is truncated

🤖 AI解决方案

报错分析报告

1. 错误翻译



原文:struct.error: unpack_from requires a buffer of at least 4 bytes for unpacking 4 bytes at offset 0 (actual buffer size is 0)
译文:结构体错误:unpack_from 需要至少 4 字节的缓冲区来解包 4 字节的数据(偏移量 0 处),实际缓冲区大小为 0

原文:OSError: image file is truncated
译文:操作系统错误:图像文件被截断(不完整)

2. 原因分析


这是一个典型的 图像文件损坏/不完整 问题:

  • 根本原因:你的 PNG 图像文件可能没有完全下载、保存时被中断,或者文件本身已损坏,导致文件结尾不完整

  • 具体位置:错误发生在 PIL(Python Imaging Library)尝试读取 PNG 图像文件时,在解析文件头部信息时发现数据不足(缓冲区大小为 0)

  • 错误链:用户程序 → Google Gemini API → PIL 图像处理 → PNG 解析失败
  • 3. 解决方案


    有两种修复方案:

    方案一:尝试修复图像文件(如果文件需要保留)

    python
    from PIL import Image
    import io

    def fix_truncated_image(image_path):
    """
    尝试修复截断的图像文件
    """
    try:
    # 尝试读取并重新保存图像
    with open(image_path, 'rb') as f:
    image_data = f.read()

    # 创建一个新的完整图像文件
    image = Image.open(io.BytesIO(image_data))
    image.load() # 强制加载所有数据

    # 重新保存为完整文件
    image.save(f"fixed_{image_path}")
    return Image.open(f"fixed_{image_path}")
    except Exception as e:
    print(f"无法修复图像: {e}")
    return None

    使用示例


    fixed_image = fix_truncated_image("your_image.png")
    if fixed_image:
    # 使用修复后的图像
    response = client.models.generate_content(fixed_image)

    方案二:重新获取图像文件(推荐)

    python
    import requests
    from PIL import Image
    import io

    def download_and_verify_image(url, save_path="image.png"):
    """
    下载图像并验证完整性
    """
    try:
    # 下载图像
    response = requests.get(url, stream=True, timeout=30)
    response.raise_for_status()

    # 写入文件
    with open(save_path, 'wb') as f:
    for chunk in response.iter_content(chunk_size=8192):
    f.write(chunk)

    # 验证图像完整性
    with Image.open(save_path) as img:
    img.verify() # 验证图像数据
    img.load() # 加载图像数据
    print(f"图像验证成功: {save_path}")
    return img

    except Exception as e:
    print(f"图像下载或验证失败: {e}")
    # 删除可能损坏的文件
    import os
    if os.path.exists(save_path):
    os.remove(save_path)
    return None

    使用示例


    image = download_and_verify_image("https://your-image-url.com/image.png")
    if image:
    response = client.models.generate_content(image)

    4. ️ 预防措施


  • 文件完整性检查

  • python
    # 在使用图像前进行验证
    from PIL import Image

    def verify_image(image_path):
    try:
    with Image.open(image_path) as img:
    img.verify() # 验证但不加载
    img.load() # 完整加载
    return True
    except Exception:
    return False

  • 使用安全的文件下载方式

  • - 使用 requests 库时启用 stream=True 和超时设置
    - 下载完成后立即验证文件完整性
    - 使用临时文件,验证成功后再移动到最终位置

    推荐工具

  • file 命令检查文件类型

  • truncate 或文件大小检查

  • 使用 PIL.Image.verify() 方法在加载前验证图像