Автоматически применять коэффициент масштабирования к изображениям, вставленным из буфера обмена

Я использую дисплей HiDPI с коэффициентом масштабирования 150%. Каждый раз, когда я делаю скриншот и вставляю его в Discourse, всё оказывается слишком крупным. Мне приходится вручную применять коэффициент масштабирования к изображению, чтобы оно выглядело нормально.

Предположим, я сделал скриншот следующего блока размером 110x110 пикселей.

Когда я вставляю этот скриншот (Ctrl+V) в редактор, получаю изображение размером 167x167 пикселей.


![image|167x167](upload://fWfpRZXtBMVBXjcMTAPOwtG5bND.png)

В идеале я бы хотел получать изображение правильного размера без необходимости запоминать правильный процент для уменьшения масштаба (в моём случае это 66%).


![image|167x167, 66%](upload://fWfpRZXtBMVBXjcMTAPOwtG5bND.png)

Я вижу два варианта решения. Если коэффициент масштабирования не равен 1, то:

  1. Автоматически добавлять правильный коэффициент масштабирования в Markdown изображения
    ![image|167x167, 66%](...)

или

  1. Добавлять правильный коэффициент масштабирования в панель инструментов изображения в окне предпросмотра
    image

Коэффициент масштабирования можно вычислить на JavaScript:

Math.floor(100 / window.devicePixelRatio)
6 лайков

Отличная идея, я тоже постоянно с этим сталкиваюсь.

Думаю вслух: не вызовет ли это ложных срабатываний, если пользователь скопирует и вставит изображение, которое не является скриншотом?

Также, касательно реализации, я не вижу причин, почему мы не можем реализовать оба варианта 1 и 2 одновременно.

4 лайка

Да, это будет ложным срабатыванием, если вы вставите изображение, которое не является скриншотом. Интересно, что вставляется чаще: скриншоты или другие изображения. :thinking:

1 лайк

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

В любом случае, начиная с варианта 2, мы избежим ложных срабатываний; это просто предоставит более удобный размер по умолчанию для предпросмотра.

1 лайк

Похоже, что инструменты для создания скриншотов кодируют некоторую информацию о DPI в файлы PNG. Например, если я загружу скриншот из моей среды macOS с высоким разрешением на https://www.metadata2go.com/, я увижу:

Если я отключу HiDPI, то эти поля метаданных, похоже, исчезнут из файла.

Вы наблюдаете что-то подобное на Windows, @gerhard? Если да, то, возможно, есть способ прочитать это в JS и сделать предположение о плотности пикселей.

Также я наткнулся на этот gist, который может быть полезен.

2 лайка

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

2 лайка

Я использую Spectacle в Linux, и, похоже, он не добавляет ничего в метаданные.

Код из этого gist возвращает false для скриншота, созданного мной в системе Linux с коэффициентом масштабирования 150%. Блок pHYs этого изображения выглядит так:

{ xDpu: 3780, yDpu: 3780, xDpi: 96, yDpi: 96, unit: 'meter' }
3 лайка