如何在图像(Jpg,Bmp)或透明文本(颜色与同一背景图像)上写一个半透明文本,但带有阴影,我想要做的是为图像添加水印.
我想用Delphi win32来实现这一点.
一种选择是在Windows.pas单元中使用AlphaBlend函数.像这样的东西会在图像上叠加半透明文本(带有投影 - 建立在Jim McKeeth的响应上):
uses Windows, Graphics; . . . var BackgroundImage: Graphics.TBitmap; { need to call out specifically for Graphics.TBitmap because the Windows unit also has a TBitmap declaration } TextImage: Graphics.TBitmap; BlendFunc: BLENDFUNCTION; begin BlendFunc.BlendOp := AC_SRC_OVER; BlendFunc.BlendFlags := 0; BlendFunc.SourceConstantAlpha := $C0; { a hex value from $00-$FF (0-255). Represents the percent of opaqueness: $00 is completely transparent, $FF is completely opaque. $C0 is 75% opaque } BlendFunc.AlphaFormat := AC_SRC_ALPHA; { BackgroundImage is for holding the image you want to overlay text onto } BackgroundImage := Graphics.TBitmap.Create; try BackgroundImage.LoadFromFile('yourimagehere.bmp'); { Create another TBitmap to hold the text you want to overlay } TextImage := Graphics.TBitmap.Create; try { Set this bitmap to have the same dimensions as the background image you want the text to appear on. } TextImage.Height := BackgroundImage.Height; TextImage.Width := BackgroundImage.Width; { In my limited experience with AlphaBlend, Black is always 100% transparent. So, paint TextImage completely Black. Play around with this to see the effect it has on the final outcome. } TextImage.Canvas.Brush.Color := clBlack; TextImage.Canvas.FloodFill(0, 0, clNone, fsBorder); TextImage.Canvas.Font.Style := [fsBold]; { Write the shadow first } TextImage.Canvas.Brush.Style := bsClear; TextImage.Canvas.Font.Color := clDkGray; TextImage.Canvas.TextOut(11, 11, 'Test'); { Then put the text on top (slightly offset) } TextImage.Canvas.Brush.Style := bsClear; TextImage.Canvas.Font.Color := clMaroon; TextImage.Canvas.TextOut(10, 10, 'Test'); { Use the AlphaBlend function to overlay the bitmap holding the text on top of the bitmap holding the original image. } Windows.AlphaBlend(BackgroundImage.Canvas.Handle, 0, 0, TextImage.Width, TextImage.Height, TextImage.Canvas.Handle, 0, 0, TextImage.Width, TextImage.Height, BlendFunc); { Assign the now updated BackgroundImage to a TImage control for display } Image1.Picture.Bitmap.Assign(BackgroundImage); finally TextImage.Free; end; finally BackgroundImage.Free; end; end;