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

如何复用cv2读取的图片在Tkinter中创建ImageTk.PhotoImage?

问题解答:复用OpenCV读取的图片对象到Tkinter的PhotoImage

当然可以复用你已经用OpenCV读取的image对象,不过得先做个格式转换——因为OpenCV和PIL(ImageTk依赖它)的图片数据格式、颜色通道顺序不一样,直接传会报错。

关键差异说明

  • OpenCV的cv2.imread()读取的是BGR通道顺序的numpy数组,而PIL默认使用RGB通道顺序。
  • ImageTk.PhotoImage()只接受PIL的Image对象,不直接支持numpy数组,所以得先把OpenCV的数组转成PIL Image。

修改后的完整代码

from tkinter import *
from PIL import ImageTk, Image
import cv2

# 用OpenCV读取图片
image = cv2.imread("New_refImg.png")
# 注意:cv2.shape返回的是 (高度, 宽度, 通道数),你原来的变量名搞反了!
height_1, width_1, channels = image.shape

# 转换颜色通道:BGR → RGB
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 把numpy数组转成PIL Image对象
pil_image = Image.fromarray(image_rgb)
# 再转成ImageTk能用的格式
img = ImageTk.PhotoImage(pil_image)

# 创建窗口和画布,这里用正确的宽高
canvas = Canvas(width=width_1, height=height_1, bg='blue')
canvas.pack(expand=YES, fill=BOTH)
canvas.create_image(10, 10, image=img, anchor=NW)

mainloop()

重要提醒

你原来的代码里width_1, height_1, channels = image.shape是错误的!OpenCV返回的shape第一个值是图片的高度,第二个才是宽度,如果不修正,你的窗口大小会和图片实际尺寸颠倒,显示出问题。

这样修改后,就只需要读取一次图片文件,复用了OpenCV加载的图片数据,同时也保证了Tkinter能正确显示图片。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:34:43