2012-05-09 70 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