Имея свой самописный элемент управления кнопкой (TMyButton), полученный из TCustomControl, я хочу добавить возможность создавать эффект свечения для подписи MyButton. После долгого пребывания в Гулге я понял, что лучший способ создать свечение - это нарисовать текст заданным цветом, затем размыть все - текст и поверхность, на которой он лежит, а затем снова нарисовать текст. Он будет работать отлично, только если поверхность твердая, например. заливает красным цветом. Я создал процедуру, которая делает растровое изображение размытым, но моя кнопка может иметь не сплошной фон, например растровое изображение, которое может быть заполнено градиентом. Если я размою этот фон, он станет очень ужасным, но свечение выглядит красиво.
Я предполагаю, что эту задачу можно решить с помощью Scanline, но я понятия не имею, что именно мне с ним делать.
Если использовать сплошную заливку, у меня есть это (заполнено clWhite):
Если использовать растровую заливку, у меня есть это («Текст» имеет тень clBlack):
Вот так выглядит размытое растровое изображение, показанное выше, без размытия:
Кто-нибудь знает, как сделать эффект свечения для текста без размытия растрового изображения?
P.S. код для размытия растрового изображения
procedure DrawBlurEffect(BmpInOut: TBitmap; Radius: Integer);
var
A, B, C, D: PRGBArray;
x, y, i: Integer;
begin
BmpInOut.PixelFormat := pf24bit;
for i:=0 to Radius do
begin
for y:=2 to BmpInOut.Height - 2 do
begin
A := BmpInOut.ScanLine[y-1];
B := BmpInOut.ScanLine[y];
C := BmpInOut.ScanLine[y+1];
D := BmpInOut.ScanLine[y];
for x:=1 to BmpInOut.Width - 2 do
begin
B[x].Red := Trunc(C[x].Red + A[x].Red + B[x-1].Red + D[x+1].Red) div 4;
B[x].Green := Trunc(C[x].Green + A[x].Green + B[x-1].Green + D[x+1].Green) div 4;
B[x].Blue := Trunc(C[x].Blue + A[x].Blue + B[x-1].Blue + D[x+1].Blue) div 4;
end;
end;
end;
end;