2012-05-09 36 views
4

这个想法是从数据库(文本和图片)检索日期,然后将这些数据添加到另一张图片(如身份证表格),然后保存新图片。德尔福:如何添加文字到图像并保存新图像?

这怎么能在delphi中完成?

THX

+4

将图像加载到TBitmap中。调用TBitmap.Canvas.TextOut。保存位图。 –

+5

欢迎来到StackOverflow!请尝试重新提出您的问题;这听起来像是一个完整的家庭作业,你尝试过什么吗?对你的问题:1)*从DB加载图像* - 在互联网上有很多例子,只是尝试搜索一个2)*在另一张图片中添加这些数据* - 你想添加什么数据到另一张图片和怎么样 ?你的意思是从数据库加载图片和一些文字,让我们说图片描述,并在图片上绘制这个描述并保存在某个地方?什么是身份证表格? – TLama

+0

@TLama是的,我从数据库加载图像,并且是这样的东西。这里是身份证的形式:http://i891.photobucket.com/albums/ac114/evilkidaz/ID.png我必须从数据库中加载名称,姓氏和图像,并将它们放在窗体中的位置,然后保存它。我只在插入图片中的这些数据时遇到困难 DavidHeffernan感谢您的回复,但文字带有灰色背景。我可以更改字体吗?让它变大还是改变颜色?编辑:我发现如何插入图像:[code] Image1.Canvas.Draw(1,1,graphic); [/ code] –

回答

13

尝试以下操作:

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; 

下面是它的外观:

enter image description here

+1

:D工程很好 感谢您的帮助 –

+5

@TLama处理背景的习惯Delphi方式是设置'Canvas.Brush.Style:= bsClear'。你的方式可行,但当VCL将它包装得很好时,我并不认为需要使用原始GDI。 –

+1

@大卫,绝对!我甚至不知道我在哪里设想的。它必须来自我很久以前见过的一些老例子。现在我使用我的(基于GDI的)框架来处理这样的事情,所以我甚至都没有考虑过。感谢提示! – TLama