如何使用文本居中绘制纯色位图?

时间:2014-08-21 05:24:13

标签: delphi bitmap firemonkey delphi-xe6

下面的代码应该创建一个48x48矩形的位图,蓝色背景颜色和水平和垂直白色居中的文本(实际上只是一个字母)。

然而没有任何事情发生。

procedure MakeCustomIcon(AText: string; AWidth: Integer; AHeight: Integer; AColor: TAlphaColor; var ABlob: TBlob);
var
  Bitmap: TBitmap;
  Rect: TRectF;
  InStream: TMemoryStream;
begin
  Bitmap := TBitmap.Create;
  InStream := TMemoryStream.Create;
  try
    Bitmap.SetSize(AWidth, AHeight);

    Bitmap.Canvas.Clear(AColor);

    Bitmap.Canvas.Stroke.Kind := TBrushKind.bkSolid;
    Bitmap.Canvas.StrokeThickness := 1;
    Bitmap.Canvas.Fill.Color := TAlphaColorRec.White;
    Bitmap.Canvas.BeginScene;

    Rect.Create(0, 0, AWidth, AHeight);
    Bitmap.Canvas.FillText(Rect, AText, true, 100, [TFillTextFlag.ftRightToLeft], TTextAlign.taCenter, TTextAlign.taCenter);

    Bitmap.Canvas.EndScene;

    Bitmap.SaveToStream(InStream);

    InStream.Position := 0;

    ABlob.Clear;
    ABlob.LoadFromStream(InStream);
  finally
    Bitmap.Free;
    InStream.Free;
  end;

我已经测试了我的程序的其余部分,以确保图像(Blob)实际上正在传输和显示,并且它正在这样做。问题完全包含在上面方法的位图绘制方式上。

这个TBlob是一个字节数组。

我正在寻找下面这样的矩形,用于TListView:

this

2 个答案:

答案 0 :(得分:2)

我准备了一个项目。

1-)在TImage上写文字

2-)在TImage上绘图

3-)对TImage的影响

我试穿XE5

样品:

procedure ReDraw(Image: TImage);
var
  MyRect: TRectF;
begin
  if Image.Bitmap.IsEmpty then Exit;

  MyRect := TRectF.Create(0, Ozellik.SeritTop, Image.Bitmap.Width, Ozellik.SeritBot);
  with Image.Bitmap.Canvas do
  begin
    BeginScene;
    if not Seffaf.IsChecked then
      Fill.Color := Ozellik.SeritRenk
    else
      Fill.Color := TAlphaColorRec.Null;
    FillRect(MyRect, 0, 0, [], 1);
    Fill.Color := Ozellik.YaziRenk;
    if FontCombo.ItemIndex <> -1 then
      Font.Family := FontCombo.Items[FontCombo.ItemIndex];
    Font.Size := Ozellik.YaziBoyut;
    FillText(MyRect,FonYazi.Text.Trim,True,1,[],TTextAlign.taCenter,TTextAlign.taCenter);
    EndScene;
  end;
  Image.Repaint;
end;

http://www.dosya.tc/server32/vHsbaC/CapsYapMasa_st_.rar.html

enter image description here

enter image description here

答案 1 :(得分:1)

所有画布图必须分组为 BeginScene / EndScene 块。此外,建议在try-finally块中绘制。

所以,而不是

Bitmap.Canvas.Clear(AColor);
...
Bitmap.Canvas.BeginScene;
...
Bitmap.Canvas.EndScene;

你应该这样做:

Bitmap.Canvas.BeginScene;
try
  Bitmap.Canvas.Clear(AColor);
  ...
finally
  Bitmap.Canvas.EndScene;
end; 

- 问候