Как сделать текст вдоль дуги на изображении?
У меня есть следующий код в Delphi 7 для рисования текста авторского права по изогнутому краю DVD. Мы используем старую версию Graphics32.
Мы переходим на Delphi XE5 с последним кодом от Graphics32, и этот код больше не компилируется; в частности LoadArcCurve и drawingBuffer.RenderFittedText больше не существуют как методы.
procedure TCDLabel.DrawCopyrightText(const drawingBuffer: TBitmap32Ex);
var
FixedPointArray : TArrayOfFixedPoint;
Center : TFixedPoint;
vAngle1 : double;
vAngle2 : double;
radius : integer;
CopyrightText : string;
textColor : TColor32;
begin
radius := (fImageSize div 2) - 30;
UpdateTextTransform(8{2.3}, drawingBuffer);
Center.x := GR32.Fixed(fImageSize div 2);
Center.y := GR32.Fixed(fImageSize div 2);
vAngle1 := DegToRad(-130);
textColor := clWhite32;
vAngle2 := DegToRad(0);
LoadArcCurve(Center, GR32.Fixed(radius), GR32.Fixed(radius), vAngle1, vAngle2, FixedPointArray);
CopyrightText := Format('%s %s Dystopia Unlimited. All rights reserved.', [GetCopyrightSymbol, fCopyrightYears]);
drawingBuffer.RenderFittedText(CopyrightText, textColor, pdoAntialising or pdoFilling, FixedPointArray);
FixedPointArray := NIL;
end; {DrawCopyrightText}
У меня есть следующий фрагмент кода в Delphi XE5, использующий последний код Graphic32, и я безуспешно пытался использовать другие подобные методы.
canvas := TCanvas32.Create(drawingBuffer); // drawingBuffer is a TBitmap32
try
canvas.Brushes.Add(TStrokeBrush);
canvas.Brushes[0].Visible := TRUE;
(canvas.Brushes[0] as TStrokeBrush).StrokeWidth := 2;
(canvas.Brushes[0] as TStrokeBrush).FillColor := clWhite32;
canvas.Path.BeginPath;
canvas.Path.Arc(Center, -130, 0, radius);
canvas.Path.EndPath;
TextToPath(drawingBuffer.Font.Handle, canvas.Path, FloatRect(0, 0, fImageSize, fImageSize), CopyrightText);
Все примеры в новом Graphics32, которые я могу найти, отображаются непосредственно на холсте элемента управления Delphi, в то время как я должен рисовать на TBitmap32.
Как визуализировать текст по дуге в изображении / растровом изображении, используя Delphi XE5 и последнюю версию Graphics32?
2 ответа
Я думаю, что лучший способ реализовать то, что вы описываете, это использовать отличное расширение Angus Johnson для graphics32, GR32_Text.
Используя указатель на работу Ангуса Джонсона, которую предоставил Дэвид Хеффернан, следующий код является решением моего вопроса.
Этот код использует единицы измерения: GR32_Lines, GR32_Text, GR32_Misc, а также другие. Он также не защищает память и не выполняет какие-либо другие защитные процессы, необходимые для выпускаемого кода.
procedure DrawCopyrightText(const drawingBuffer: TBitmap32);
var
fixedPointArray : TArrayOfFixedPoint;
CopyrightText : string;
ttFont : TTrueTypeFont;
text32 : TText32;
i: integer;
polyPolyPts: TArrayOfArrayOfArrayOfFixedPoint;
begin
CopyrightText := Format('%s %s Dystopia Unlimited. All rights reserved.', [GetCopyrightSymbol, fCopyrightYears]);
text32 := TText32.Create;
ttFont := TTrueTypeFont.Create(COPYRIGHT_FONT_NAME, COPYRIGHT_FONT_SIZE);
fixedPointArray := GetArcPoints(FloatRect(30, 30, 2370, 2370), -140, 0);
polyPolyPts := text32.GetEx(fixedPointArray, CopyrightText, ttFont, aLeft, aMiddle, true, 2);
for i := 0 to high(polyPolyPts) do
if length(polyPolyPts[i]) > 0 then
SimpleFill(drawingBuffer, polyPolyPts[i], clWhite32, clWhite32);
end;