Tag: 图片预览模式: 普通 | 列表

  利用GDI+可以很方便的制作带水印效果的图片,网上介绍这方面的文章也很多,但鲜有Delphi的,本文参照网上文章http://www.codeproject.com/KB/GDI-plus/watermark.aspx介 绍的方法,用Delphi 2007制作水印效果图片,原代码如下:

Delphi代码
  1. unit Main;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.   Dialogs, Gdiplus, StdCtrls;  
  8.   
  9. type  
  10.   TMainForm = class(TForm)  
  11.     Button1: TButton;  
  12.     procedure FormPaint(Sender: TObject);  
  13.     procedure FormCreate(Sender: TObject);  
  14.     procedure FormDestroy(Sender: TObject);  
  15.     procedure Button1Click(Sender: TObject);  
  16.   private  
  17.     { Private declarations }  
  18.     Photo: TGpImage;  
  19.     PhWidth: Integer;  
  20.     PhHeight: Integer;  
  21.     Watermark: TGpImage;  
  22.     WmWidth: Integer;  
  23.     WmHeight: Integer;  
  24.     Bmp: TGpBitmap;  
  25.   public  
  26.     { Public declarations }  
  27.   end;  
  28.   
  29. var  
  30.   MainForm: TMainForm;  
  31.   
  32. implementation  
  33.   
  34. uses GdipTypes;  
  35.   
  36. {$R *.dfm}  
  37.   
  38. procedure TMainForm.Button1Click(Sender: TObject);  
  39. var  
  40.   Clsid: TGUID;  
  41.   Parameters: TEncoderParameters;  
  42.   Quality: Integer;  
  43. begin  
  44.   // 设置图像品质编码参数  
  45.   Parameters.Count := 1;  
  46.   Parameters.Parameter[0].Guid := EncoderQuality;  
  47.   Parameters.Parameter[0].ValueType := EncoderParameterValueTypeLong;  
  48.   Parameters.Parameter[0].NumberOfValues := 1;  
  49.   // 设置参数的值:品质等级,最高为100,图像文件大小与品质成正比  
  50.   Quality := 100;  
  51.   Parameters.Parameter[0].Value := @Quality;  
  52.   
  53.   if GetEncoderClsid('image/jpeg', Clsid) then  
  54.     Bmp.Save('WatermarkPhoto.jpg', Clsid, @Parameters);  
  55. end;  
  56.   
  57. procedure TMainForm.FormCreate(Sender: TObject);  
  58. const  
  59.   ColorMatrix: TColorMatrix =  
  60.   (  
  61.     (1.00.00.00.00.0),  
  62.     (0.01.00.00.00.0),  
  63.     (0.00.01.00.00.0),  
  64.     (0.00.00.00.30.0),  
  65.     (0.00.00.00.01.0)  
  66.   );  
  67.   WorkingDirectory = '....Media';  
  68.   copyright = 'Copyright © 2008 - Maozefa';  
  69. var  
  70.   gp: TGpGraphics;  
  71.   imageAttr: TGpImageAttributes;  
  72.   strFormat: TGpStringFormat;  
  73.   font: TGpFont;  
  74.   x, y: Single;  
  75. begin  
  76.   // 读取原始图片  
  77.   Photo := TGpImage.Create(WorkingDirectory + '100_0349.jpg');  
  78.   PhWidth := Photo.Width;  
  79.   PhHeight := Photo.Height;  
  80.   // 读取水印图片  
  81.   Watermark := TGpImage.Create(WorkingDirectory + 'Watermark.bmp');  
  82.   WmWidth := Watermark.Width;  
  83.   WmHeight := Watermark.Height;  
  84.   // 建立一个新的位图,分辨率为72  
  85.   Bmp := TGpBitmap.Create(PhWidth, PhHeight, pf32bppArgb);  
  86.   Bmp.SetResolution(7272);  
  87.   // 建立新位图的画布,并设置图像显示质量和文本显示质量  
  88.   gp := TGpGraphics.Create(Bmp);  
  89.   gp.SmoothingMode := smAntiAlias;  
  90.   gp.TextRenderingHint := thAntiAlias;  
  91.   // 在画布上画原始图片  
  92.   gp.DrawImage(Photo, GpRect(00, PhWidth, PhHeight),  
  93.                00, PhWidth, PhHeight, utPixel);  
  94.   // 建立图像显示辅助类  
  95.   imageAttr := TGpImageAttributes.Create;  
  96.   // 设置透明颜色为水印图片四角的底色,水印图显示为圆角图片  
  97.   imageAttr.SetColorKey($ff00ff00$ff00ff00, ctBitmap);  
  98.   // 设置水印图片不透明度为0.3  
  99.   imageAttr.SetColorMatrix(ColorMatrix, cfDefault, ctBitmap);  
  100.   // 在画布左上角画水印图  
  101.   gp.DrawImage(Watermark, GpRect({PhWidth - WmWidth - }1010, WmWidth, WmHeight),  
  102.                00, WmWidth, WmHeight, utPixel, imageAttr);  
  103.   // 设置文本字体和显示格式  
  104.   font := TGpFont.Create('arial'16, [fsBold]);  
  105.   strFormat := TGpStringFormat.Create;  
  106.   strFormat.Alignment := saCenter;  
  107.   // 在画布下方居中显示阴影文本  
  108.   x := PhWidth / 2;  
  109.   y := PhHeight - 26;  
  110.   gp.DrawString(copyright, font, Brushs[$99000000], x + 1, y + 1, strFormat);  
  111.   gp.DrawString(copyright, font, Brushs[$99ffffff], x, y, strFormat);  
  112.   
  113.   font.Free;  
  114.   strFormat.Free;  
  115.   imageAttr.Free;  
  116.   gp.Free;  
  117. end;  
  118.   
  119. procedure TMainForm.FormDestroy(Sender: TObject);  
  120. begin  
  121.   Photo.Free;  
  122.   Watermark.Free;  
  123.   Bmp.Free;  
  124. end;  
  125.   
  126. procedure TMainForm.FormPaint(Sender: TObject);  
  127. var  
  128.   g: TGpGraphics;  
  129. begin  
  130.   g := TGpGraphics.Create(Canvas.Handle);  
  131.   // 显示原始图片  
  132.   g.DrawImage(Photo, 00, PhWidth, PhHeight);  
  133.   // 显示水印原始图片  
  134.   g.TranslateTransform(0, PhHeight + 5);  
  135.   g.DrawImage(Watermark, 00, WmWidth, WmHeight);  
  136.   // 显示带水印和文本的图像  
  137.   g.TranslateTransform(PhWidth, -(PhHeight + 5));  
  138.   g.DrawImage(Bmp, 00, PhWidth, PhHeight);  
  139.   g.Free;  
  140. end;  
  141.   
  142. end.  

  代码中已经进行了注释,不再累叙,针对本文所参考的文章内容(Addr:http://www.codeproject.com/KB/GDI-plus/watermark.aspx), 作几点说明:

    1、在参考的文章中,对文本字体、显示位置进行了测试和计算,本文为强调主要内容,对这些代码进行了简化;

    2、在水印底色透明处理中,原文采用的是TGpImageAttributes.SetRemapTable方法,而本文采用的则是 TGpImageAttributes.SetColorKey方法,效果是一样的,具体原理可参照我的文章《GDI+ 在Delphi程序的应用 -- 图像的透明显示技巧》;

查看更多...

Tags: 图片 水印

分类:Delphi | 固定链接 | 评论: 0 | 引用: 0 | 查看次数: 37