Python OpenCV全屏显示图片如何避免拉伸并从左上角绘制
OpenCV全屏展示无拉伸、左上角对齐的实现方案
问题核心原因
直接调用OpenCV全屏接口显示原图时,默认会把图像拉伸到和窗口尺寸完全匹配,且当图像尺寸小于窗口时自动居中渲染,没有开放直接修改对齐方式、关闭拉伸的参数,所以需要通过预处理画布的方式实现需求。
具体实现逻辑
解决图像拉伸变形
不直接将原图传入全屏窗口,先按照屏幕分辨率对原图做等比例缩放,缩放过程中严格保持原图宽高比,剩余未覆盖的窗口区域用纯色背景填充,从根源上避免拉伸。
缩放计算规则:- 先获取屏幕/全屏窗口的实际宽高,记为
screen_w、screen_h - 分别计算原图宽高比、屏幕宽高比
- 以“缩放后图像不超出屏幕边界”为原则计算缩放比例:图像偏宽就以屏幕宽度为基准缩放,图像偏高就以屏幕高度为基准缩放
- 缩放时根据缩放场景选插值算法:缩小时用
cv2.INTER_AREA,放大时用cv2.INTER_CUBIC,显示效果更清晰
- 先获取屏幕/全屏窗口的实际宽高,记为
实现图像左上角对齐绘制
利用OpenCV数组切片的贴图逻辑实现:- 先创建一张和屏幕分辨率完全一致的背景画布,默认可以用黑色填充,需要其他背景色直接修改对应BGR色值即可
- 把等比缩放后的图像,直接粘贴到画布坐标
(0,0)的起始位置,也就是画布数组的左上角切片位置 - 因为最终传入窗口的画布尺寸和全屏窗口尺寸完全一致,OpenCV不会触发自动居中逻辑,图像自然从窗口左上角开始显示
可直接运行的参考代码
import cv2 import numpy as np # 初始化全屏窗口 cv2.namedWindow("fullscreen_show", cv2.WINDOW_NORMAL) cv2.setWindowProperty("fullscreen_show", cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) # 读取待展示图像 img = cv2.imread("your_image_path.jpg") img_h, img_w = img.shape[:2] # 获取当前全屏窗口对应的屏幕分辨率 _, _, screen_w, screen_h = cv2.getWindowImageRect("fullscreen_show") # 计算等比缩放后的图像尺寸 img_ratio = img_w / img_h screen_ratio = screen_w / screen_h if img_ratio > screen_ratio: scaled_w = screen_w scaled_h = int(img_h * scaled_w / img_w) else: scaled_h = screen_h scaled_w = int(img_w * scaled_h / img_h) # 执行等比缩放 interp = cv2.INTER_AREA if scaled_w < img_w else cv2.INTER_CUBIC scaled_img = cv2.resize(img, (scaled_w, scaled_h), interpolation=interp) # 创建屏幕等大的纯色背景画布(这里用黑色背景,可自行修改BGR值换色) canvas = np.zeros((screen_h, screen_w, 3), dtype=np.uint8) # 将缩放后的图像贴到画布左上角 canvas[0:scaled_h, 0:scaled_w] = scaled_img # 渲染展示 cv2.imshow("fullscreen_show", canvas) # 按任意键退出 cv2.waitKey(0) cv2.destroyAllWindows()
补充说明:多屏场景下,
cv2.getWindowImageRect会自动获取窗口当前所在屏幕的分辨率,只需要提前把窗口移动到目标屏幕再执行渲染逻辑即可,不需要额外做多屏适配。
内容的提问来源于stack exchange,提问作者leo6002
相关产品推荐
相关产品推荐

