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

Нарисовать градиент на Canvas с произвольным количеством цветов

Delphi , Графика и Игры , Canvas

Нарисовать градиент на Canvas с произвольным количеством цветов

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

{ 
  The following code allows you to draw a gradient on a canvas with 
  an arbitrary number of colors (minimum 2). 
  To draw a gradient on a form's canvas, 
  call the DrawGradient() in the OnPaint and OnResize-event handlers. 
}

 { 
  Mit dieser Prozedur kann man auf einen Canvas einen Farbverlauf mit 
  beliebig vielen Farben (min. 2) zeichnen. 
  Z.B. wenn auf eine Form ein Farbverlauf gezeichnet werden soll, 
  rufe die DrawGradient() Funktion im OnPaint-Ereignis und 
  im OnResize-Ereignis der Form auf. 
}

 procedure DrawGradient(ACanvas: TCanvas; Rect: TRect;
   Horicontal: Boolean; Colors: array of TColor);
 type
   RGBArray = array[0..2] of Byte;
 var
   x, y, z, stelle, mx, bis, faColorsh, mass: Integer;
   Faktor: double;
   A: RGBArray;
   B: array of RGBArray;
   merkw: integer;
   merks: TPenStyle;
   merkp: TColor;
 begin
   mx := High(Colors);
   if mx > 0 then
   begin
     if Horicontal then
       mass := Rect.Right - Rect.Left
     else
       mass := Rect.Bottom - Rect.Top;
     SetLength(b, mx + 1);
     for x := 0 to mx do
     begin
       Colors[x] := ColorToRGB(Colors[x]);
       b[x][0] := GetRValue(Colors[x]);
       b[x][1] := GetGValue(Colors[x]);
       b[x][2] := GetBValue(Colors[x]);
     end;
     merkw := ACanvas.Pen.Width;
     merks := ACanvas.Pen.Style;
     merkp := ACanvas.Pen.Color;
     ACanvas.Pen.Width := 1;
     ACanvas.Pen.Style := psSolid;
     faColorsh := Round(mass / mx);
     for y := 0 to mx - 1 do
     begin
       if y = mx - 1 then
         bis := mass - y * faColorsh - 1
       else
         bis := faColorsh;
       for x := 0 to bis do
       begin
         Stelle := x + y * faColorsh;
         faktor := x / bis;
         for z := 0 to 3 do
           a[z] := Trunc(b[y][z] + ((b[y + 1][z] - b[y][z]) * Faktor));
         ACanvas.Pen.Color := RGB(a[0], a[1], a[2]);
         if Horicontal then
         begin
           ACanvas.MoveTo(Rect.Left + Stelle, Rect.Top);
           ACanvas.LineTo(Rect.Left + Stelle, Rect.Bottom);
         end
         else
         begin
           ACanvas.MoveTo(Rect.Left, Rect.Top + Stelle);
           ACanvas.LineTo(Rect.Right, Rect.Top + Stelle);
         end;
       end;
     end;
     b := nil;
     ACanvas.Pen.Width := merkw;
     ACanvas.Pen.Style := merks;
     ACanvas.Pen.Color := merkp;
   end
   else
     // Please specify at least two colors 
    raise EMathError.Create('Es mussen mindestens zwei Farben angegeben werden.');
 end;

 // Example Calls: 
// Aufrufbeispiele: 

DrawGradient(Image1.Canvas, Rect(0, 0, 100, 200), False, [clRed, $00FFA9B4]);

 DrawGradient(Canvas, GetClientRect, True, [121351, clBtnFace, clBlack, clWhite]);

Программный код на языке Delphi, позволяющий нарисовать градиент на канвасе с произвольным количеством цветов. Процедура DrawGradient принимает четыре параметра:

  • ACanvas: Канвас, на котором будет нарисован градиент.
  • Rect: Прямоугольник, определяющий область, где будет нарисован градиент.
  • Horicontal: Булевое значение, указывающее, является ли градиент горизонтальным (истина) или вертикальным (ложь).
  • Colors: Массив значений типа TColor, представляющих цвета, которые будут использованы в градиенте.

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

Рассказ о том, как работает код:

  1. Процедура сначала проверяет, есть ли хотя бы два цвета в массиве Colors. Если нет, она бросает исключение.
  2. Затем она устанавливает некоторые локальные переменные: mx - высокое значение массива Colors, mass - ширина или высота прямоугольника в зависимости от того, является ли градиент горизонтальным или вертикальным, и b - массив для хранения RGB-значений каждого цвета.
  3. Код проходит через каждый цвет в массиве Colors и конвертирует его в массив RGB с помощью функций ColorToRGB, GetRValue, GetGValue и GetBValue.
  4. Затем код устанавливает некоторые дополнительные локальные переменные: merkw - ширина пера, merks - стиль пера и merkp - цвет пера.
  5. Код проходит через каждый пиксель в прямоугольнике, рассчитывая расстояние между каждой парой цветов с помощью переменной faColorsh. Затем он использует эту информацию для интерполирования цветов для градиента, смешивая RGB-значения каждого цвета.
  6. Наконец, код рисует линию на каждом пиксельном месте с использованием интерполированного цвета.

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

Некоторые предложения по улучшению:

  1. Вместо того, чтобы закодировать ширину пера, стиль пера и цвет пера, рассмотрите возможность сделать их параметрами процедуры DrawGradient.
  2. Рассмотрите добавление более надежной обработки ошибок, например, проверку на пустой прямоугольник или null-значение массива Colors.
  3. Код может быть оптимизирован с помощью использования более эффективного алгоритма интерполирования цветов, такого как использование таблицы поиска или болееadvanced метод интерполирования.

В целом, это полезный и хорошо написанный код, демонстрирующий, как нарисовать градиент на канвасе с произвольным количеством цветов.

Нарисовать градиент на Canvas с произвольным количеством цветов.


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

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




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


:: Главная :: Canvas ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-07-02 06:03:35/0.0063190460205078/0