При разработке приложений с использованием компонента TImage в среде FireMonkey, разработчики часто сталкиваются с необходимостью управления качеством изображения при изменении его размеров. Одной из задач является отключение интерполяции для достижения эффекта "ближайшего соседа" (nearest neighbor), особенно важного при создании функций масштабирования, таких как "pinch-to-zoom".
Проблема интерполяции в TImage
Интерполяция в TImage позволяет изменять размер изображения с минимальной потерей качества за счет сглаживания пикселей. Однако в некоторых случаях, например, при создании игр с использованием плиток, важно сохранить четкость границ пикселей, что невозможно достичь с помощью стандартной интерполяции.
Проблема с отключением интерполяции на GPU канвасе
Пользователи сообщают, что настройка свойства DisableInterpolation на True не работает в Windows, если установлено GlobalUseGPUCanvas в True, а также на Android, где используется GPU канвас по умолчанию. Это подтверждается примерами из образцов кода, таких как "Image Zoom" от Embarcadero, где при включении GlobalUseGPUCanvas интерполяция не отключается.
Альтернативное решение с использованием TTexture
В качестве альтернативы использованию TImage, можно рисовать изображения напрямую на канвасе, используя TTexture. При создании текстуры можно установить параметр GL_NEAREST вместо GL_LINEAR, что позволит использовать алгоритм "ближайшего соседа" для интерполяции.
Пример кода на Object Pascal для создания текстуры с использованием GL_NEAREST:
class procedure TCustomContextOpenGL.DoInitializeTexture(const Texture: TTexture);
var
Tex: GLuint;
begin
// ... инициализация текстуры ...
case Texture.MagFilter of
TTextureFilter.Nearest: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
TTextureFilter.Linear: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
end;
// ... дальнейшие настройки текстуры ...
end;
Пример рисования текстуры на канвасе:
TCustomCanvasGpu(Canvas).DrawTexture(...);
Важные замечания:
Замена TImage на TControl с использованием TTexture для рисования не требует полной переработки пользовательского интерфейса на OpenGL.
Для получения примеров использования TTexture можно обратиться к коду исходного проекта, например, на GitHub.
При использовании TTexture в играх с высокой частотой обновления изображений (например, 100 раз в секунду) важно учитывать возможное увеличение нагрузки на процессор из-за дополнительной конвертации текстур.
Заключение
Для отключения интерполяции в TImage при использовании GPU канваса в FireMonkey можно использовать TTexture с настройкой параметра GL_NEAREST. Это позволит сохранить четкость изображений на различных устройствах, не теряя при этом качества "pinch-to-zoom" функционала.
Разработчики FireMonkey сталкиваются с необходимостью отключения интерполяции в компоненте TImage для сохранения качества изображения без сглаживания пикселей на различных устройствах.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.