Python Flask应用PIL.UnidentifiedImageError问题求助
PIL.UnidentifiedImageError: 无法识别Google Drive图片文件
我开发了一个Python Flask应用,会调用外部.py文件中的函数处理Google Drive上的图片,近期在list_face_encodings函数中突然出现以下错误:
PIL.UnidentifiedImageError: cannot identify image file <_io.BytesIO object at 0x000001FDE90AA750>
错误触发在代码的image_data = Image.open(io.BytesIO(response.content))语句。此前代码运行正常,我已经尝试更新Pillow到最新版本,也查阅过相关平台的同类问题解决方案,但问题仍未解决。
相关代码如下:
import cv2 from PIL import Image from io import BytesIO import requests import numpy as np import io class processimage: def create_parent_folder(drive_service, parent_folder_name): # Check if the parent folder exists query = f"mimeType='application/vnd.google-apps.folder' and name='{parent_folder_name}'" results = drive_service.files().list(q=query).execute().get("files", []) if results: # Parent folder already exists, return its ID parent_folder_id = results[0]["id"] else: # Parent folder does not exist, create it parent_folder_metadata = { "name": parent_folder_name, "mimeType": "application/vnd.google-apps.folder", } parent_folder = ( drive_service.files() .create(body=parent_folder_metadata, fields="id") .execute() ) parent_folder_id = parent_folder["id"] return parent_folder_id def create_folder(drive_service, folder_name, parent_folder=None): folder_metadata = { "name": folder_name, "mimeType": "application/vnd.google-apps.folder", } if parent_folder: # If parent_folder is provided, set it as the parent folder_metadata["parents"] = [parent_folder] folder = ( drive_service.files().create(body=folder_metadata, fields="id").execute() ) # Replace with the ID of the file you want to share permission_metadata = { "type": "anyone", "role": "reader", } # Add the permission to the folder drive_service.permissions().create( fileId=folder["id"], body=permission_metadata ).execute() return folder["id"] def list_files_in_folder(drive_service, source_folder_id): # List files in the source folder results = ( drive_service.files() .list( q=f"'{source_folder_id}' in parents and trashed=false", fields="files(id, name)", ) .execute() ) files = results.get("files", []) return files def find_face_encodings(image_path): image_path = processimage.preprocess_image(image_path) face_locations = face_recognition.face_locations(image_path) face_encodings = face_recognition.face_encodings(image_path, face_locations) if not face_encodings: return None else: return face_encodings def preprocess_image(image): image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) image_rgb = cv2.resize(image_rgb, (0, 0), fx=0.5, fy=0.5) return image_rgb def list_face_encoding(files): known_faces = [] print("filess", files) for file in files: image_2_url = "https:....." + str(file["id"]) response = requests.get(image_2_url) if response.status_code == 200: image_data = Image.open(io.BytesIO(response.content)) image_p = np.array(image_data) image_p = cv2.cvtColor( image_p, cv2.COLOR_RGB2BGR ) # Convert to BGR format image_2 = processimage.find_face_encodings(image_p) print("response done") else: print("########", response.status_code) print("###############", response.text) i = 0 while image_2 is None: image_p = cv2.rotate(image_p, cv2.ROTATE_90_CLOCKWISE) image_2 = processimage.find_face_encodings(image_p) i += 1 print(f"Changing orientation.") if i == 4: print("No face found") break known_faces.append(image_2) return known_faces def face_to_be_checked(image_1): image_1 = cv2.imread(image_1) image_1 = processimage.find_face_encodings(image_1) # print("image_1 at package",image_1) n = 0 while image_1 is None: image = cv2.rotate(image, cv2.ROTATE_90_CLOCKWISE) image_1 = processimage.find_face_encodings(image) print("No face found in the reference image.", n) n += 1 # photo is not not detected in the input if n == 4: print("no face found,check image") break return image_1
排查修复方案
修正Google Drive图片链接格式
直接拼接ID的链接可能返回HTML预览页而非图片文件,替换为正确的图片下载格式:image_2_url = f"https://drive.google.com/uc?export=view&id={file['id']}"同时添加内容类型校验,确认返回的是图片:
if response.status_code == 200: content_type = response.headers.get('Content-Type', '') if not content_type.startswith('image/'): print(f"文件{file['name']}({file['id']})非图片类型: {content_type}") continue添加异常捕获与容错处理
在打开图片的代码块外包裹try-except,避免单个错误中断整个流程:try: image_data = Image.open(io.BytesIO(response.content)) # 后续图片处理逻辑 except PIL.UnidentifiedImageError: print(f"无法识别图片{file['id']},跳过该文件") continue检查文件权限与状态
手动访问拼接后的链接,确认文件是否能正常打开、是否被删除或权限变更。即使文件夹设置了公开可读,单个文件的权限可能被单独修改。强制刷新请求缓存
添加请求头避免requests缓存旧的无效响应:headers = {'Cache-Control': 'no-cache', 'Pragma': 'no-cache'} response = requests.get(image_2_url, headers=headers)
内容的提问来源于stack exchange,提问作者cofimonk
相关产品推荐
相关产品推荐

