我可以使用以下方法设置内部笔记本电脑面板的显示缩放模式:
xrandr --output LVDS1 --set "scaling mode" "Full aspect"
然而,这不适用于外部显示器(DP1、VGA1、DP1),因为不支持缩放模式属性:
$> xrandr --output HDMI1 --set "scaling mode" "Full aspect"
X Error of failed request: BadName (named color or font does not exist)
Major opcode of failed request: 140 (RANDR)
Minor opcode of failed request: 11 (RRQueryOutputProperty)
Serial number of failed request: 47
Current serial number in output stream: 47
显示较低分辨率内容时如何保持宽高比?
答案1
缩放模式属性尚未在 intel 驱动程序中实现(看这里)。它在专有的 AMD 和 NVIDIA 驱动程序中实现,并且最近在开源 radeon 驱动程序中实现(这里)。
但是,您可以通过使用 xrandr 手动执行缩放来解决此限制:
假设您的屏幕的原始分辨率为 1920x1080,并且您想要显示未拉伸的 1024x768 分辨率。长宽比的比例为16/9至4/3。所以 1.333333 变为 1。
xrandr --output HDMI1 --mode 1024x768 --scale 1.33333333x1 --panning 1024x768
这将使屏幕具有正确的分辨率和正确的宽高比。但它并不居中。为了实现这一点,我们需要使用变换选项将其(大致)放在屏幕的中心(1024*1.3333333 - 1024 = 342 / 2 = 171):
xrandr --output HDMI1 --mode 1024x768 --panning 1024x768 --transform 1.33333333,0,-171,0,1,0,0,0,1
不幸的是,未使用的屏幕背景是灰色和/或乱码,而不是黑色。
答案2
接受的答案几乎是我使用英特尔 GPU 渲染带有黑色边框的较低分辨率所需的答案。我的目标是以 5120x1440 超超宽原生分辨率渲染 1920x1080 帧缓冲区,以黑色边框为中心(用于截屏):
xrandr \
--output DP-1 \
--mode 5120x1440 \
--fb 1920x1080 \
--transform 2.666666667,0,1600,0,1.33333333333,180,0,0,1 \
--panning 1920x1080
参数详细解释:
- 输出:输出端口(例如DP-1、HDMI-1等)
- 模式:显示器显示模式(例如原始分辨率)
- 脸书:帧缓冲区大小
- 转换:3x3 仿射变换矩阵,描述如何在监视器几何体中变换渲染输出的几何体;换句话说,“如何”在显示器上定位帧缓冲区
- 平移:窗口管理器可用的总区域
对我来说主要的区别是参数的顺序 至关重要。对于我的硬件,有必要确保平移发生在之后转换。
变换矩阵具有以下形状(忽略旋转):
sx 0 tx tx = translation x (x pos)
0 sy ty ty = translation y (y pos)
0 0 1 sx = scale x
sy = scale y
转换为 xrandr 参数:sx,0,tx,0,sy,ty,0,0,1
计算如下:
sx = 5120/1920 = 2.66666666667
sy = 1440/1080 = 1.33333333333
tx = (5120 / 2) - (1920 / 2) = 1600
ty = (1440 / 2) - (1080 / 2) = 180
使用该矩阵,我们指示显示服务器按 (2.66666666667, 1.33333333333) 缩放帧缓冲区,然后通过平移 1600x180 单位将其居中。