Delphi: 如何向图像添加文本并保存新图片?

4

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

在Delphi中如何实现这个想法?

谢谢。


4
将图像加载到 TBitmap 中。调用 TBitmap.Canvas.TextOut。保存位图。 - David Heffernan
5
欢迎来到StackOverflow!请尽量重新表述您的问题;在我看来,它听起来像是一个完整的家庭作业,您尝试过什么吗?回答你的问题:1)从数据库中加载图像 - 网上有很多示例,请尝试搜索一下。2)将这些数据添加到另一张图片中 - 您想要将什么数据添加到哪张另一张图片中以及如何添加?您是否想从数据库中加载图片和一些文本(比如图像描述),并在图像上绘制此描述,然后将其保存在某个地方?而 ID 表单是什么? - TLama
@TLama 是的,我从数据库中加载了图像,差不多就是这样。这是ID表单:http://i891.photobucket.com/albums/ac114/evilkidaz/ID.png 我需要从数据库中加载名字、姓氏和图像,并将它们放在表单中的相应位置,然后保存。我只有在插入这些数据到图片中遇到了问题。DavidHeffernan 谢谢您的回复,但是文本带有灰色背景。我能改变字体吗?把它变大或者改变颜色?编辑:我已经找到了如何插入图像:[code]Image1.Canvas.Draw(1,1,graphic);[/code] - Ouerghi Yassine
发现答案了 :) 谢谢大家 - Ouerghi Yassine
1个回答

14

尝试以下操作:

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;

以下是它的样子:

在此输入图片描述


5
在Delphi中,处理背景的惯用方式是设置Canvas.Brush.Style := bsClear。你的方法可以运行,但我认为没有必要在VCL已经很好地封装了GDI时使用原始的GDI。 - David Heffernan
1
@David,当然!我甚至不知道我是从哪里假设的。可能是来自我很久以前看到的一些旧例子。现在我正在使用我的(基于GDI的)框架,这样的事情都被封装起来了,所以我甚至没有考虑过它。感谢你的提示! - TLama

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接