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

Изменение цвета всех путей в векторном изображении SVG в Delphi с использованием Cairo

Delphi , Графика и Игры , Цвета и Палитра

В векторе рисовании изображений SVG в Delphi, когда используется библиотека Cairo вместе с librsvg, может возникать проблема с изменением цвета всех путей на один и тот же цвет в режиме запуска приложения. В частности, проблема заключается в том, что цвет изменяется только для первого пути, в то время как остальные пути остаются не затронутыми, сохраняя изначальный цвет (черный - #000000).

Пример кода, представленного в запросе, не позволяет изменить цвет для всех путей, так как установка цвета производится один раз до операции рисования, и это изменение влияет только на первый путь. Для решения этой проблемы можно использовать функцию загрузки SVG файла в строку, как это происходит с XML, после чего заменить все упоминания о старом цвете путей на новый, и сохранить результат в поток памяти. Затем, с помощью этого потока, создается новый экземпляр TRSVGObject, который уже содержит измененные цвета для всех путей.

procedure TForm1.ChangeImageColor(const aMStream: TMemoryStream; const aFileName: TFileName; const aOldColor, aNewColor: TColor);
var
    wStringList:          TStringList;
    wNewColor, wOldColor: string;
const
    cHEX_NUMBERS = 6;
begin
    wOldColor := IntToHex(ColorToRGB(aOldColor), cHEX_NUMBERS);
    wNewColor := IntToHex(ColorToRGB(aNewColor), cHEX_NUMBERS);

    wStringList := TStringList.Create;
    try
        wStringList.LoadFromFile(aFileName);
        wStringList.Text := StringReplace(wStringList.Text, 'fill:#' + wOldColor, 'fill:#' + wNewColor,
        [rfReplaceAll, rfIgnoreCase]);
        wStringList.Text := StringReplace(wStringList.Text, 'stroke:#' + wOldColor, 'stroke:#' + wNewColor,
        [rfReplaceAll, rfIgnoreCase]);

        wStringList.SaveToStream(aMStream);
    finally
        FreeAndNil(wStringList);
    end;
end;

Затем, после обновления потока памяти с новыми цветами, создается экземпляр TRSVGObject с использованием обновленного потока памяти как параметра:

wMemStream := TMemoryStream.Create;
try
    if aOldColor <> aNewColor then
        ChangeImageColor(wMemStream, aFileName, aOldColor, aNewColor)
    else
        wMemStream.LoadFromFile(aFileName);

    wSVGObject := TRSVGObject.Create(wMemStream);
//... (продолжение кода рисования)
finally
    FreeAndNil(wMemStream);
end;

Более свежие версии компонентов Cairo и librsvg можно скачать по ссылке: https://code.google.com/p/delphignomevectorgraphic/source/browse/trunk/?r=4, где представлены бинарные файлы и юниты для Delphi. Для использования кода необходимо определить следующие директивы: {$Define CAIRO_HAS_RSVG_FUNCTIONS} и {$Define CAIRO_HAS_WIN32_SURFACE}.

Таким образом, приведенная выше методика позволяет изменить цвет всех путей в SVG изображении, используя возможности Delphi и библиотеки Cairo.

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

Пользователь просит изменить цвета всех путей в векторном изображении SVG в Delphi, используя библиотеку Cairo, путем модификации цвета в SVG коде, после чего создать новый объект TRSVGObject с обновленным потоком данных, содержащим измененные цвета.


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

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




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


:: Главная :: Цвета и Палитра ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-03-14 09:14:11/0.003262996673584/0