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

Python OpenCV全屏显示图片如何避免拉伸并从左上角绘制

OpenCV全屏展示无拉伸、左上角对齐的实现方案

问题核心原因

直接调用OpenCV全屏接口显示原图时,默认会把图像拉伸到和窗口尺寸完全匹配,且当图像尺寸小于窗口时自动居中渲染,没有开放直接修改对齐方式、关闭拉伸的参数,所以需要通过预处理画布的方式实现需求。

具体实现逻辑

  • 解决图像拉伸变形
    不直接将原图传入全屏窗口,先按照屏幕分辨率对原图做等比例缩放,缩放过程中严格保持原图宽高比,剩余未覆盖的窗口区域用纯色背景填充,从根源上避免拉伸。
    缩放计算规则:

    1. 先获取屏幕/全屏窗口的实际宽高,记为screen_w、screen_h
    2. 分别计算原图宽高比、屏幕宽高比
    3. 以“缩放后图像不超出屏幕边界”为原则计算缩放比例:图像偏宽就以屏幕宽度为基准缩放,图像偏高就以屏幕高度为基准缩放
    4. 缩放时根据缩放场景选插值算法:缩小时用cv2.INTER_AREA,放大时用cv2.INTER_CUBIC,显示效果更清晰
  • 实现图像左上角对齐绘制
    利用OpenCV数组切片的贴图逻辑实现:

    1. 先创建一张和屏幕分辨率完全一致的背景画布,默认可以用黑色填充,需要其他背景色直接修改对应BGR色值即可
    2. 把等比缩放后的图像,直接粘贴到画布坐标(0,0)的起始位置,也就是画布数组的左上角切片位置
    3. 因为最终传入窗口的画布尺寸和全屏窗口尺寸完全一致,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:12:31