【问题标题】:Delphi: how Add text to an image and save the new image?Delphi:如何将文本添加到图像并保存新图像?
【发布时间】:2012-05-09 13:18:49
【问题描述】:

想法是从数据库(文本和图片)中检索日期,然后将这些数据添加到另一张图片(如 ID 表单)中,然后保存新图片。

如何在 delphi 中做到这一点?

谢谢

【问题讨论】:

  • 将图像加载到 TBitmap 中。调用 TBitmap.Canvas.TextOut。保存位图。
  • 欢迎来到 StackOverflow!请尝试改写您的问题;这听起来像是一个完整的家庭作业,你尝试过吗?对于您的问题:1)从数据库加载图像 - 互联网上有很多示例,只需尝试搜索一个 2)将这些数据添加到另一张图片中 - 什么数据你想添加什么另一张图片以及如何?您的意思是从数据库中加载图片以及一些文本,比如说图像描述,然后在图像上绘制此描述并将其保存在某处?什么是身份证?
  • @TLama 是的,我从数据库加载了图像,是的,类似的东西。这是 ID 表格:i891.photobucket.com/albums/ac114/evilkidaz/ID.png 我必须从数据库中加载姓名、姓氏和图像,并将它们放在表格中的位置,然后保存。我只是在图片中插入这些数据时遇到了麻烦 DavidHeffernan 谢谢您的回复,但文字带有灰色背景。我可以更改字体吗?让它变大或改变颜色?编辑:我发现了如何通过以下方式插入图像:[code]Image1.Canvas.Draw(1,1,graphic);[/code]
  • 编辑:Image1.Canvas.Font.Color := clRed; Image1.Canvas.Brush.Style := bsClear;找到了答案:) thx all

标签: image delphi


【解决方案1】:

尝试以下方法:

uses
  PNGImage;

procedure TForm1.Button1Click(Sender: TObject);
var
  PNGImage: TPNGImage;
  BlobStream: TMemoryStream;
begin
  // create the PNG image instance
  PNGImage := TPNGImage.Create;
  try
    // assuming you have in the BlobStream variable the image from a DB loaded
    PNGImage.LoadFromStream(BlobStream);
    // setup the text background to be transparent
    PNGImage.Canvas.Brush.Style := bsClear;
    // optionally configure the font
    PNGImage.Canvas.Font.Size := 11;
    PNGImage.Canvas.Font.Color := clRed;
    PNGImage.Canvas.Font.Style := [fsBold];
    // and render it to the image's canvas
    PNGImage.Canvas.TextOut(5, 5, 'SomeText');
    // save this modified image to the file
    PNGImage.SaveToFile('c:\picture.png');
  finally
    // and finally free the PNG image instance
    PNGImage.Free;
  end;
end;

这是一个如何创建我的名片的示例(不要忘记将necessary image 文件保存为d:\llamas.png):

uses
  GraphUtil, PNGImage;

procedure CreateCard(const AFileFile: string; AImage: TPNGImage;
  const AName, ASurname: string);
begin
  with TPNGImage.CreateBlank(COLOR_RGB, 8, 330, 160) do
  try
    GradientFillCanvas(Canvas, clWhite, $000080FF,
      Canvas.ClipRect, gdVertical);
    Canvas.StretchDraw(Rect(18, 18, 108, 108), AImage);
    Canvas.Pen.Width := 2;
    Canvas.Brush.Style := bsClear;
    Canvas.Rectangle(5, 5, Width - 4, Height - 4);
    Canvas.Font.Size := 12;
    Canvas.Font.Style := [fsBold];
    Canvas.TextOut(110, 30, 'Form:  ' + AName + '  :.');
    Canvas.TextOut(125, 60, 'Genus:  ' + ASurname + '  :.');
    SaveToFile(AFileFile);
  finally
    Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  PNGImage: TPNGImage;
begin
  PNGImage := TPNGImage.Create;
  try
    // here you will load the image blob (by using LoadFromStream)
    // instead of LoadFromFile
    PNGImage.LoadFromFile('d:\llamas.png');
    CreateCard('d:\visit-card.png', PNGImage, 'Alpaca', 'Lama');
  finally
    PNGImage.Free;
  end;
end;

这是它的样子:

【讨论】:

  • @TLama Delphi 惯用的后台处理方式是设置Canvas.Brush.Style := bsClear。你的方法行得通,但是当 VCL 很好地包装它时,我认为不需要在这里使用原始 GDI。
  • @David,绝对!我什至不知道我在哪里假设了这一点。它一定来自我很久以前看过的一些老例子。现在我正在使用我的(基于 GDI 的)框架,其中包含这样的东西,所以我什至没有考虑它。感谢您的提示!
猜你喜欢
  • 2012-12-03
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多