Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

"Десатурация изображений в DirectX с использованием AsphyreSphinx"

Delphi , Графика и Игры , DirectX и DelphiX

Десатурация изображений в DirectX с использованием AsphyreSphinx

Разработчики, работающие с графическими библиотеками и фреймворками, часто сталкиваются с необходимостью обработки изображений в различных цветовых пространствах. Одной из таких операций является десатурация, или превращение цветного изображения в черно-белое. В данной статье мы рассмотрим, как выполнить эту задачу, используя фреймворк AsphyreSphinx для работы с 2D DirectX сценами в среде Delphi.

Проблема

Разработчик, использующий AsphyreSphinx для рисования 2D DirectX сцен на полотно формы, столкнулся с необходимостью десатурировать изображение, то есть получить его черно-белую версию. Попытки использовать различные параметры функции TexMap не привели к желаемому результату. Также была предпринята попытка ручной десатурации изображения после его загрузки с использованием функции cLerp, но этот метод оказался слишком медленным и не дал нужного результата.

Решение

AsphyreSphinx не предназначен для обработки изображений, а служит для их отображения. Для выполнения задачи десатурации следует использовать специализированные библиотеки, например, Graphics32. Однако, разработчик смог найти решение, написав функцию, которая преобразует изображение в оттенки серого:

procedure DesaturateImage(const AImage: TAsphyreImage);
type
  PPixelRec = ^TPixelRec;
  TPixelRec = packed record
    B: Byte;
    G: Byte;
    R: Byte;
    A: Byte;
  end;
var
  C1, x, y: Integer;
  bitsp: Pointer;
  pitch: Integer;
  bytes_per_pixel: Integer;
  pixel: PPixelRec;
  gray_value: Byte;
begin
  for C1 := 0 to AImage.TextureCount - 1 do
  begin
    AImage.Texture[C1].Lock(Rect(0, 0, AImage.Texture[C1].Width, AImage.Texture[C1].Height), bitsp, pitch);
    try
      bytes_per_pixel := pitch div AImage.Texture[C1].Width;
      for y := 0 to AImage.Texture[C1].Height - 1 do
        for x := 0 to AImage.Texture[C1].Width - 1 do
        begin
          pixel := PPixelRec(Integer(bitsp) + y * pitch + x * bytes_per_pixel);
          gray_value := Round(0.30 * pixel^.R + 0.59 * pixel^.G + 0.11 * pixel^.B);
          pixel^.R := gray_value;
          pixel^.G := gray_value;
          pixel^.B := gray_value;
        end;
    finally
      AImage.Texture[C1].Unlock;
    end;
  end;
end;

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

Заключение

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

Создано по материалам из источника по ссылке.

Десатурация изображений в DirectX с использованием AsphyreSphinx предполагает преобразование цветного изображения в черно-белое с помощью специализированной функции, написанной разработчиком, так как стандартные возможности фреймворка не предусматривают


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DirectX и DelphiX ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 09:01:20/0.0032980442047119/0