У меня монитор 23,8 дюйма. Вывод xrandr =

Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 16384 x 16384
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
HDMI-2 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 527mm x 296mm panning 1920x1080+0+0
   1920x1080     60.00*+  50.00    59.94  
   1920x1080i    60.00    50.00    59.94  
   1680x1050     59.88  
   1600x900      60.00  
   1280x1024     75.02    60.02  
   1280x800      59.91  
   1152x864      75.00  
   1280x720      60.00    50.00    59.94  
   1024x768      75.03    60.00  
   832x624       74.55  
   800x600       75.00    60.32  
   720x576       50.00  
   720x576i      50.00  
   720x480       60.00    59.94  
   720x480i      60.00    59.94  
   640x480       75.00    60.00    59.94  
   720x400       70.08  

Я хочу смоделировать монитор меньшего размера (~ 15 дюймов) на моем мониторе следующим образом:

|----------|-----|
|          |     |
|  X       |  Y  |
|          |     |
|      ~15 |     |
|-----------     |
|            23.8|
-----------------

Область X должна вести себя как обычный монитор, а область Y должна быть пустой (черный экран).

Я пытаюсь сделать с xrandr, но безуспешно. Любые идеи, как я могу обрезать экран, как показано выше, и показать все содержимое экрана (в меньшем разрешении) в области X?

Любая помощь приветствуется

2
harsh 1 Дек 2020 в 17:43

1 ответ

Лучший ответ

xrandr может (сообщить графическому процессору) применить произвольный матрица преобразования в однородные координаты (для 2D это матрица 3x3 с концом (g h i ниже) обычно всегда [0 0 1]):

--transform a,b,c,d,e,f,g,h,i
Задает матрицу преобразования для применения к выходным данным. Автоматически выбирается билинейный фильтр. Математическая форма соответствует:

a b c
d e f
g h i

Преобразование основано на однородных координатах. Матрица, умноженная на вектор координат пикселя вывода, дает преобразованный вектор координат пикселя в графическом буфере. [...]

Это намекает на то, что от сжатого дисплея к большему фактическому буферу кадра нужно умножать более чем на 1. Таким образом, чтобы сжать буфер кадра до дисплея, меньшего на 23,8/15, нужно умножить (а не разделить) на 23,8/15 верхнее значение 2x2. левую часть матрицы, чтобы получить:

1.5867   0     0
0     1.5867   0
0        0     1

Как только это будет достигнуто, необходимо вручную сохранить предыдущий размер виртуального экрана (т.е. размер буфера кадра) таким, какой он был, иначе он будет просто вычисляться как больший, чтобы по-прежнему покрывать монитор: --fb 1920x1080.

--fb widthxheight
Изменяет конфигурацию экрана до указанного размера. Все сконфигурированные мониторы должны соответствовать этому размеру. Когда эта опция не предусмотрена, xrandr вычисляет наименьший размер экрана, который будет содержать набор настроенные выходы; эта опция предоставляет способ переопределить это поведение.

Этот параметр является глобальным, а не для каждого монитора.

Это дает:

$ xrandr --output HDMI-2 --transform 1.5867,0,0,0,1.5867,0,0,0,1 --fb 1920x1080

Я просто показал общий случай, если вы хотите применить несколько эффектов (например, перевод): вам нужно будет перемножить матрицы и предоставить только конечную результирующую матрицу. На самом деле это простое преобразование, вместо этого есть специальная опция:

--scale xxy
Изменяет размеры выходного изображения. Значения, превышающие 1, приведут к сжатию экрана (размер экрана больше, чем размер экрана). размер выходного режима), а значения ниже 1 приводят к увеличению на выходе. Эта опция на самом деле является сокращенной версией --transform вариант.

Итак, в итоге просто:

$ xrandr --output HDMI-2 --scale 1.5867x1.5867 --fb 1920x1080

Есть предупреждение, потому что результат больше не закрывает монитор:

xrandr: specified screen 1920x1080 not large enough for output HDMI-2 (3047x1714+0+0)

Режим вывода не изменился (его можно было явно указать с помощью --mode 1920x1080 --rate 60.00).

1
A.B 2 Дек 2020 в 01:44
Спасибо за ответ A.B, я попробовал это, и теперь области X и Y отображаются, как требуется. Режим вывода (для области X) такой же, как 1920x1080. Но если я пытаюсь установить его как любой другой режим (--mode 1024x768), то экран закрывает весь монитор и разницы в области X и Y уже нет. Я не совсем понял математику, и мое понимание масштабирования заключается в том, что оно будет пропорционально пропорциям экрана в соответствии с дробью независимо от разрешения .... это правда? ....
 – 
harsh
2 Дек 2020 в 19:13
... Является ли "1.5867" привязанным к определенному разрешению (в данном случае 1920x1080). В основном я хочу, чтобы разрешение в области X было 1024x768 ИЛИ 800x600. Что я должен сделать, чтобы достичь этого?
 – 
harsh
2 Дек 2020 в 19:13
Ваш ответ хорош, пожалуйста, не ампутируйте. На основании вашего ответа приемлемый результат дает следующее: - "xrandr --output HDMI-2 --mode 1024x768 --fb 1290x1024 --scale 1,5867x1,5867".
 – 
harsh
2 Дек 2020 в 19:57
Та же команда с разрешением 800x600 покрывает весь монитор и не дает вывода, как на экране типа X и Y. (xrandr --output HDMI-2 --mode 800x600 --fb 1290x1024 --scale 1,5867x1,5867). Почему команда ведет себя иначе для 800x600?
 – 
harsh
2 Дек 2020 в 20:03
Да, извините, это 1920, а не 1290. Для более низкого разрешения параметр масштабирования не работает? Я имею в виду, что мы все равно должны получить вывод независимо от разрешения в области X, но в случае команды 800x600 весь монитор покрыт... Я имею в виду в основном, как получить разрешение 800x600 в области X, в то время как область, отличная от X, остается пустой. ?
 – 
harsh
2 Дек 2020 в 20:28