уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

На протяжении всего цикла статей про KML в Delphi я не затрагивал вопроса о том, как в Delphi получить строку с цветом, который используется для заливки полигонов или рисования линий в KML. Вместе с этим, далеко не всегда удобно в Delphi передавать цвет в HEX-форме — намного удобнее задавать цвет в удобной для нас форме, например, как TColor или TAlphaColor. Сегодня разберемся с тем, как получить цвет в HEX-форме для KML. Получить цвет для KML намного проще, чем, например, смешать два цвета в RYB. Всё, что нам необходимо — это получить все составляющие цвета в Delphi и немного переставить байты местами.

Как получить составляющие цвета R, G, B из TColor

Первый способ — использовать возможности модулей Winapi.Windows и Vcl.Graphics:

//AColor: TColor
var RGBColor: Longint;
    R, G, B: byte;
begin
  //получаем представление цвета в RGB
  RGBColor:=ColorToRGB(AColor);
  //Используем методы Winapi.Windows для получения RGB
  R:=GetRValue(RGBColor);
  G:=GetGValue(RGBColor);
  B:=GetBValue(RGBColor);

Второй способ чуть по-быстрее — использовать LongRec из System.SysUtils

//AColor: TColor
var RGBColor: Longint;
    R, G, B: byte;
begin
  RGBColor:=ColorToRGB(ColorBox1.Selected);
  R:=LongRec(RGBColor).Bytes[0];
  G:=LongRec(RGBColor).Bytes[1];
  B:=LongRec(RGBColor).Bytes[2];

Третий способ — использовать модуль System.UITypes

var RGBColor: LongInt;
    R, G, B: byte;
begin
  RGBColor:=ColorToRGB(clWindowFrame);
  //используем TColorRec из System.UITypes
  R:=TColorRec(RGBColor).R;
  G:=TColorRec(RGBColor).G;
  B:=TColorRec(RGBColor).B;
end;

Все три способа приведут к одному и тому же результату — получению компонентов цвета RGB вне зависимости от того, что вы передадите в переменной Color — обычный красный цвет (clRed) или что-нибудь из системных цветов, типа clWindowFrame, которые в Delphi, как известно, имеют отрицательные значения — функция ColorToRGB из Vcl.Graphics приведет цвет к обычному RGB.
С получением RGB разобрались. Теперь перейдем к следующей части — получению HEX-значений.

Преобразование TColor в HEX

Здесь тоже всё достаточно просто, тем более, что в Delphi для этого есть замечательная функция IntToHex(). Для того, чтобы представить TColor в виде HEX нам необходимо:

  1. Получить все составляющие цвета RGB — это мы сделали выше
  2. Преобразовать значения R, G и B в HEX
  3. Составить строку из полученных HEX-значений

Например, вот так можно получить из TColor его представление в HEX:

//AColor: TColor
var RGBColor: LongInt;
    R, G, B: byte;
    HexColor: string;
begin
  RGBColor:=ColorToRGB(ColorBox1.Selected);
  //получаем R, G, B
  R:=LongRec(RGBColor).Bytes[0];
  G:=LongRec(RGBColor).Bytes[1];
  B:=LongRec(RGBColor).Bytes[2];
  //преобразуем в HEX
  HexColor:=IntToHex(R,2)+IntToHex(G,2)+IntToHex(B,2) ;
end;

Или с использованием хэлперов Delphi про один из которых я рассказывал:

HexColor:=R.ToHexString(2)+
          G.ToHexString(2)+
          B.ToHexString(2);

Использование хэлпера (в нашем случае — это TByteHelper) приведет ровно к тому же результату, что и в первом случае — будет произведен вызов функции IntToHex().

Теперь, всё, что нам остается — это правильно сформировать строку цвета для KML и добавить в эту строку значение Альфа-канала.

Создаем цвет для KML

В KML Reference говорится, что значения цвета и непрозрачности (opacity, альфа) выражаются в шестнадцатеричном формате, как AABBGGRR, где:

  • AA — непрозрачность (Opacity)
  • BB — значение синего компонента (от 0 до 255 или от 00 до FF)
  • GG— значение зеленого компонента (от 0 до 255 или от 00 до FF)
  • RR — значение красного компонента (от 0 до 255 или от 00 до FF)

Непрозрачность также выражается как число в диапазоне от 0 до 255, где 0 — полностью прозрачный цвет, 255 — полностью непрозрачный. Этот формат несколько отличается от формата цвета в HTML.

Собственно, всё, что нам необходимо для получения цвета в виде ABGR — у нас уже есть. Осталось разобраться с непрозрачностью, которую, всё-таки, лучше задавать в процентах, а не в диапазоне от 0 до 255. Поэтому пишем вот такую функцию получения цвета для KML в виде строки ABGR:

function ColorToKMLColor(AColor: TColor; AOpacity: byte):string;
var RGBColor: LongInt;
    R, G, B, A: byte;
begin
  if (AOpacity>100) then
    raise EProgrammerNotFound.Create('Значение AOpacity должно быть от 0 до 100%');
  A:=Round(AOpacity*2.55);//получаем opacity в диапазоне от 0 до 255
  RGBColor:=ColorToRGB(AColor);
  //получаем составляющие цвета
  R:=LongRec(RGBColor).Bytes[0];
  G:=LongRec(RGBColor).Bytes[1];
  B:=LongRec(RGBColor).Bytes[2];
  //составляем строку цвета для KML
  Result:=IntToHex(A,2)+
          IntToHex(B,2)+
          IntToHex(G,2)+
          IntToHex(R,2);
end;

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

function ColorToKMLColor(AColor: TColor; AOpacity: byte):string;
var RGBColor: LongInt;
begin
  if (AOpacity>100) then
    raise EProgrammerNotFound.Create('Значение AOpacity должно быть от 0 до 100%');
  RGBColor:=ColorToRGB(AColor);
  //составляем строку цвета для KML
  Result:=IntToHex(Round(AOpacity*2.55),2)+
          IntToHex(LongRec(RGBColor).Bytes[2],2)+
          IntToHex(LongRec(RGBColor).Bytes[1],2)+
          IntToHex(LongRec(RGBColor).Bytes[0],2);
end;

В принципе, на этом можно было бы закончить, если бы мы работали, например, в Delphi 7. Однако, в новых версиях Delphi появился ещё один тип представления цветов — TAlphaColor, который используется, в частности, в FMX. В нашем случае работать с этим типом цвета ещё проще, чем с простым TColor.

Преобразование TAlphaColor в ABGR для KML

Используем TAlphaColorRec для получения всех составляющих цвета:

function ColorToKMLColor2(AColor: TAlphaColor):string;
begin
  //составляем строку цвета для KML
  Result:=IntToHex(TAlphaColorRec(AColor).A,2)+
          IntToHex(TAlphaColorRec(AColor).B,2)+
          IntToHex(TAlphaColorRec(AColor).G,2)+
          IntToHex(TAlphaColorRec(AColor).R,2);
end;

Соответственно, обратное преобразование цвета из AGBR в TAlphaColor может быть таким:

function TForm12.GetAlphaColor(AKMLColor: string): TAlphaColor;
var R, G, B, A: integer;
    rec: TAlphaColorRec;
begin
  rec.A:=StrToInt('$'+Copy(AKMLColor, 1, 2));
  rec.R:=StrToInt('$'+Copy(AKMLColor, 7, 2));
  rec.G:=StrToInt('$'+Copy(AKMLColor, 5, 2));
  rec.B:=StrToInt('$'+Copy(AKMLColor, 3, 2));
  Result:=rec.Color;
end;

Вместо итогов

Вместо итогов статьи приведу небольшую демку для получения цвета AGBR для использования его в KML. Приложение написано с использованием FMX и представленной выше функции для получения строки из цвета TAlphaColor.

Демонстрационное приложение выглядит следующим образом:

Выбираем базовый цвет (можно сразу с прозрачностью) и, при необходимости, устанавливаем свою прозрачность, используя TrackBar. В результате, в двух Edit’ах появятся два представления цвета: в формате ARGB и для KML — AGBR.

Исходник примера можно скачать здесь:

Исходники — Google API

а готовое приложение тут:

Теперь можно получать цвета для KML и использовать их при работе с модулем kml.pas или же включить в модуль функции преобразования TColor и TAlphaColor в HEX для KML и внести изменения в классы, использующие значения цвета.

Книжная полка

Описание Подробно рассматривается библиотека FM, позволяющая создавать полнофункциональное программное обеспечение для операционных систем Windows и OS X, а также для смартфонов и планшетных компьютеров, работающих под управлением Android и iOS
купить книгу delphi на ЛитРес
Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
купить книгу delphi на ЛитРес
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
купить книгу delphi на ЛитРес
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии