You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 11:27:17