Пользовательский рисунок Delphi - светящееся стекло

Я много экспериментировал с некоторыми прозрачными изображениями, такими как то, что ниже, и я подумал, что должен быть способ, которым я могу поместить это в код, чтобы я мог раскрасить его как угодно Я хочу. Необязательно, чтобы он выглядел на 100% точно так же, как изображение ниже, но я хотел бы написать код для рисования овала и эффекта стекла (градиент с некоторыми действительно причудливыми вычислениями). Я должен четко отметить, что я плохо разбираюсь в математике, и я знаю, что для этого нужны хитрые формулы.

Пример того, над чем я работаю:

Sample image drawn with pre-made images

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

Исходное изображение левого края:

Original left edge image

Было бы очень признательно, если бы кто-нибудь указал мне на хороший учебник для этого, или если бы кто-то захотел его продемонстрировать.

Вот процедура, которую я использую для рисования:

//B = Bitmap to draw to
//Col = Color to draw glass image
procedure TForm1.DrawOval(const Col: TColor; var B: TBitmap);
var
  C: TCanvas;       //Main canvas for drawing easily
  R: TRect;         //Base rect
  R2: TRect;        //Working rect
  X: Integer;       //Main top/bottom gradient loop
  CR, CG, CB: Byte; //Base RGB color values
  TR, TG, TB: Byte; //Working RGB color values
begin
  if assigned(B) then begin
    if B <> nil then begin
      C:= B.Canvas;
      R:= C.ClipRect;  
      C.Pen.Style:= psClear;
      C.Brush.Style:= bsSolid;
      C.Brush.Color:= B.TransparentColor;
      C.FillRect(R);
      C.Pen.Style:= psSolid;
      C.Pen.Color:= clBlack;
      C.Pen.Width:= 5;
      C.Brush.Color:= clBlack;
      R2:= R;
      for X:= 1 to 6 do begin
        R2.Bottom:= R2.Bottom - 1;
        C.RoundRect(R2.Left, R2.Top, R2.Right, R2.Bottom,
          Round(R2.Bottom / 1.5), Round(R2.Bottom / 1.5));
      end;
      R2.Left:= R2.Left + 1;
      R2.Right:= R2.Right - 1;
      C.Brush.Color:= Col;
      C.Pen.Width:= 3;
      C.RoundRect(R2.Left, R2.Top, R2.Right, R2.Bottom,
        Round(R2.Bottom / 1.5), Round(R2.Bottom / 1.5));
      C.Brush.Style:= bsSolid;
      C.Pen.Style:= psClear;
      R2:= R;
      R2.Left:= R2.Left + 13;
      R2.Right:= R2.Right - 13;
      R2.Top:= 3;
      R2.Bottom:= (R2.Bottom div 2) - 18;
      CR:= GetRValue(Col);
      CG:= GetGValue(Col);
      CB:= GetBValue(Col);
      for X:= 1 to 16 do begin
        TR:= EnsureRange(CR + (X * 4)+25, 0, 255);
        TG:= EnsureRange(CG + (X * 4)+25, 0, 255);
        TB:= EnsureRange(CB + (X * 4)+25, 0, 255);
        C.Brush.Color:= RGB(TR, TG, TB);
        C.RoundRect(R2.Left, R2.Top, R2.Right, R2.Bottom,
          Round(R2.Bottom / 1.5), Round(R2.Bottom / 1.5));
        R2.Left:= R2.Left + 2;
        R2.Right:= R2.Right - 2;
        R2.Bottom:= R2.Bottom - 1;
      end;
    end;
  end;
end;
8
задан Jerry Dodge 22 November 2011 в 08:13
поделиться