На протяжении всего цикла статей про 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 нам необходимо:
- Получить все составляющие цвета RGB — это мы сделали выше
- Преобразовать значения R, G и B в HEX
- Составить строку из полученных 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.
Исходник примера можно скачать здесь:
а готовое приложение тут:
Теперь можно получать цвета для KML и использовать их при работе с модулем kml.pas или же включить в модуль функции преобразования TColor и TAlphaColor в HEX для KML и внести изменения в классы, использующие значения цвета.
Книжная полка
Описание Подробно рассматривается библиотека FM, позволяющая создавать полнофункциональное программное обеспечение для операционных систем Windows и OS X, а также для смартфонов и планшетных компьютеров, работающих под управлением Android и iOS
|
||
Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
|
||
Название: О чем не пишут в книгах по Delphi
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
|