如何在PIL.image.crop()裁剪的图像中提取主色调(无需保存文件)
无需保存裁剪图像即可提取主色调的方法
你可以利用BytesIO将裁剪后的PIL图像转为内存中的字节流,直接传给ColorThief,完全不用把文件保存到本地。ColorThief的构造函数不仅支持文件路径,还能接受类文件对象(只要实现了read()方法就行),BytesIO正好符合这个要求。
修改后的代码如下:
# -*- coding: utf-8 -*- """ Created on Wed Sep 14 11:39:07 2022 @author: nickr """ from PIL import Image from colorthief import ColorThief import io im = Image.open("C:/Users/nickr/Desktop/right.png") im1 = im.crop((0, 0, 50, 50)) # 裁剪左上角50x50的区域 im1.show() # 将裁剪后的图像转为内存字节流 img_byte_arr = io.BytesIO() im1.save(img_byte_arr, format='PNG') # 格式可根据原图像调整,比如JPG img_byte_arr.seek(0) # 将指针移到流的开头 # 直接用字节流初始化ColorThief color_thief = ColorThief(img_byte_arr) im1Color = color_thief.get_color(quality=1) print(im1Color)
关键步骤说明
- 导入
io模块创建BytesIO对象,它相当于内存中的临时文件 - 调用
im1.save()把裁剪后的图像写入字节流,注意指定和原图像匹配的格式 - 调用
seek(0)重置字节流的读取指针,否则ColorThief会从流的末尾开始读取,无法获取有效数据 - 用字节流对象代替文件路径传入ColorThief,后续的色调提取逻辑和原有代码完全一致
内容的提问来源于stack exchange,提问作者nickreitz
相关产品推荐
相关产品推荐

