如何在Delphi FMX的TPaintBox组件上绘制标准笑脸表情
实现TPaintBox上的标准笑脸表情绘制
下面是调整后的完整代码,能绘制出更贴近标准emoji的笑脸,优化了眼睛、嘴巴的形状和比例,让表情更自然:
procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas); var DrawRect, faceRect, eyeRectL, eyeRectR, eyeHighlightRectL, eyeHighlightRectR: TRectF; s, radius, lineW, eyeR, eyeOffsetX, eyeOffsetY, mouthRadius, mouthOffsetY: Single; c: TPointF; FaceColor, EyeColor, LineColor, HighlightColor: TAlphaColor; WithOutline: Boolean; begin DrawRect := PaintBox1.LocalRect; DrawRect.Inflate(-8, -8); if (Canvas = nil) or (DrawRect.Width <= 0) or (DrawRect.Height <= 0) then Exit; // 颜色与样式设置 FaceColor := $FFFFCC4D; // emoji黄色 EyeColor := $FF000000; // 黑色 LineColor := $FF7A5200; // 暖棕色轮廓 HighlightColor := $FFFFFFFF; // 眼睛高光白色 WithOutline := True; // 缩放与居中计算 s := Min(DrawRect.Width, DrawRect.Height); c := PointF( DrawRect.Left + s * 0.5 + (DrawRect.Width - s) * 0.5, DrawRect.Top + s * 0.5 + (DrawRect.Height - s) * 0.5 ); radius := 0.5 * s; // 绘制脸部 faceRect := RectF( c.X - radius, c.Y - radius, c.X + radius, c.Y + radius ); Canvas.Fill.Kind := TBrushKind.Solid; Canvas.Fill.Color := FaceColor; Canvas.FillEllipse(faceRect, 1); // 绘制脸部轮廓(可选) if WithOutline then begin lineW := Max(1.0, s * 0.04); Canvas.Stroke.Kind := TBrushKind.Solid; Canvas.Stroke.Color := LineColor; Canvas.Stroke.Thickness := lineW; Canvas.Stroke.Cap := TStrokeCap.Round; Canvas.Stroke.Join := TStrokeJoin.Round; Canvas.DrawEllipse(faceRect, 1); end; // 绘制眼睛(带高光,更贴近真实emoji) eyeR := s * 0.09; eyeOffsetX := s * 0.22; eyeOffsetY := -s * 0.12; // 左眼 eyeRectL := RectF( c.X - eyeOffsetX - eyeR, c.Y + eyeOffsetY - eyeR*0.8, c.X - eyeOffsetX + eyeR, c.Y + eyeOffsetY + eyeR*0.8 ); Canvas.Fill.Color := EyeColor; Canvas.FillEllipse(eyeRectL, 1); // 左眼高光 eyeHighlightRectL := RectF( eyeRectL.Left + eyeR*0.3, eyeRectL.Top + eyeR*0.2, eyeRectL.Left + eyeR*0.6, eyeRectL.Top + eyeR*0.5 ); Canvas.Fill.Color := HighlightColor; Canvas.FillEllipse(eyeHighlightRectL, 1); // 右眼 eyeRectR := RectF( c.X + eyeOffsetX - eyeR, c.Y + eyeOffsetY - eyeR*0.8, c.X + eyeOffsetX + eyeR, c.Y + eyeOffsetY + eyeR*0.8 ); Canvas.Fill.Color := EyeColor; Canvas.FillEllipse(eyeRectR, 1); // 右眼高光 eyeHighlightRectR := RectF( eyeRectR.Left + eyeR*0.3, eyeRectR.Top + eyeR*0.2, eyeRectR.Left + eyeR*0.6, eyeRectR.Top + eyeR*0.5 ); Canvas.Fill.Color := HighlightColor; Canvas.FillEllipse(eyeHighlightRectR, 1); // 绘制微笑嘴巴(圆弧,更自然) mouthRadius := s * 0.3; mouthOffsetY := s * 0.15; Canvas.Stroke.Kind := TBrushKind.Solid; Canvas.Stroke.Color := EyeColor; Canvas.Stroke.Thickness := Max(1.0, s * 0.05); Canvas.Stroke.Cap := TStrokeCap.Round; // 绘制下半圆弧作为微笑 Canvas.DrawArc( RectF(c.X - mouthRadius, c.Y + mouthOffsetY - mouthRadius, c.X + mouthRadius, c.Y + mouthOffsetY + mouthRadius), 180, 180 ); end;
关键修改说明
- 嘴巴绘制:用
DrawArc绘制下半圆弧替代缺失的嘴巴,弧度和位置调整为符合标准笑脸的微笑形态 - 眼睛优化:将眼睛改为扁椭圆,添加白色高光,让眼睛更有立体感和真实感
- 比例调整:微调眼睛、嘴巴的偏移量和大小比例,更贴近主流emoji的视觉比例
- 细节完善:统一线条厚度的自适应逻辑,保证不同尺寸下的显示效果一致
内容的提问来源于stack exchange,提问作者user31362432
相关产品推荐
相关产品推荐

