Страницы

Поиск по вопросам

понедельник, 16 декабря 2019 г.

Высококачественное масштабирование двумерных текстур

#cpp #windows #directx #2d #texture


Имеется экземпляр ID3D11Texture2D, который представляет текстуру содержащую некоторый
текст небольшого размера. Задача состоит в уменьшении размера этой текстуры в 2 раза
таким образом, чтобы текст сохранил читабельность.

P.S. Возможно использование сторонних библиотек.
    


Ответы

Ответ 1



Хоть Вы и говорите, что распознавать текст не нужно, но кроме как найти этот текст на текстуре, сохранить его (в виде картинки), далее уменьшить текстуру и на неё наложить текст в оригинальном разрешении сложно придумать что - то более простое. Конечно даже такой вариант требует достаточно сложно алгоритма и будет работать только с простыми текстурами, вроде этой. Не забудьте закрасить фон проверить, что текст влезает в полученную текстуру, иначе уменьшить его

Ответ 2



Наилучший результат как при уменьшении, так и при увеличении дают свёрточные фильтры. При их использовании уменьшение изображения очень похоже на наивное уменьшение, когда мы просто выбираем пиксели с определённым интервалом. Но чтобы не появилась некрасивая рябь, фильтр берёт не просто пиксели, а взвешенную сумму всех соседей на некотором расстоянии от этого пикселя: Матрица — это представление ядра свёртки в виде таблицы дискретных значений. В данном случае показан расчёт нового цвета для левого верхнего пикселя на основании цвета его непосредственных соседей. Источник изображения: https://habrahabr.ru/post/142818/ Для того, чтобы найти коэффициенты взвешенной суммы, воспользуемся фильтром Ланцоша. Он не даёт муара, а также повышает контраст изображения, делая границы чётче (что особо важно для относительно мелкого текста, читаемость которого необходимо сохранить). Мы бы могли вычислить эту таблицу самостоятельно (ради чего весь текст выше и затевался), но так как я немного запутался и в формулах, и в GIMP-овом генераторе таблицы коэффициентов, предлагаю-таки воспользоваться готовой библиотекой. Соответственно, вам подойдёт любая библиотека, работающая с этим фильтром. Вот несколько примеров: avir, fpresize. Примечание: все эти библиотеки работают с изображением в оперативной, не видеопамяти. Соответственно применять их надо после загрузки из файла и перед отправкой в объект текстуры.

Ответ 3



Переношу в ответ информацию из комментариев, для истории. Да в общем-то, в текущем виде, ответ на вопрос - "никак". Текстура DirectX - обычное растровое изображение, уменьшение растрового изображения в 2 раза означает потерю 50% информации. Для шрифта 10 размера при стандартном DPI это значит, что он будет нечитаем - тут ничего не поделать. Но, более общая задача - представить информацию с рабочего стола пользователя в таком виде, что ее можно отобразить в любом масштабе, скорее всего решаема. Ведь текст в приложениях не зарождается изначально в растровом виде, а выводится вызовом вполне определенного набора функций из GDI, GDI+ и DirectWrite. Про механику DWM мало знаю. Но для текущей задачи он бесполезен, так как оперирует теми же текстурами. Я намекаю на другое - замена на целевой системе библиотек gdi и DirectWrite на свои взломанные версии, которые бы логировали аргументы, передаваемые функциям вывода текста, чтобы потом вызвать их с другим масштабом.

Комментариев нет:

Отправить комментарий