zoukankan      html  css  js  c++  java
  • delphi 图片加水印源代码

    unit UWaterMark;
    
    interface
    
    uses
    
    {$IFNDEF DELPHIXE2ANDUP}
    
       windows,SysUtils,classes,graphics,Gdiplus;
    
     {$ELSE}
    
       winapi.windows, System.SysUtils,System.Classes,Vcl.Graphics,Gdiplus;
    
     {$ENDIF}
    
     type  TWaterMarker=class
    
          private
             fSourcePic,fWaterMarkPic,fCopyRight:string;
             fResolution:Single;
    
             Photo: TGpImage;
             PhWidth: Integer;
             PhHeight: Integer;
             Watermark: TGpImage;
             WmWidth: Integer;
             WmHeight: Integer;
             Bmp: TGpBitmap;
    
             procedure setSourcePic(value:string);
             procedure setWaterMarkPic(value:string);
             procedure setCopyRight(value:string);
             procedure  setResolution(value:single) ;
    
          public
            constructor  create(sourcePic:string='';waterMarkPic: string='');
            destructor   destroy();override;
    
            procedure  prepare();
            procedure  Render(bShowCopyRight: boolean;fontSize:single=20);
            procedure  save;
            procedure  Show(Handle: HDC);
    
          published
              property  SourcePic:string read fSourcePic write setSourcePic;
              property  WaterMarkPic:string read fWaterMarkPic write setWaterMarkPic;
              property  CopyRight:string read fCopyRight write setCopyRight;
              property  Resolution:single read fResolution write setResolution;
    
    
     end;
    
    
    
    implementation
        uses GdipTypes;
    
    
    { TWaterMarker }
    
    constructor TWaterMarker.create(sourcePic:string='';waterMarkPic: string='');
    begin
      fSourcePic:=sourcePic;
      fWaterMarkPic:=waterMarkPic;
      fCopyRight := 'Copyright ? WaterMark ';
      fResolution:=72;  //分辨率为72
    end;
    
    procedure  TWaterMarker.prepare();
    begin
      if not fileExists(fSourcePic) then Exit;
      if not fileExists(fWaterMarkPic) then Exit;
    
        // 读取原始图片
      Photo := TGpImage.Create(sourcePic);
      PhWidth := Photo.Width;
      PhHeight := Photo.Height;
      // 读取水印图片
      Watermark := TGpImage.Create(waterMarkPic);
      WmWidth := Watermark.Width;
      WmHeight := Watermark.Height;
      // 建立一个新的位图
      Bmp := TGpBitmap.Create(PhWidth, PhHeight, pf32bppArgb);
      Bmp.SetResolution(fResolution, fResolution);
    end;
    
    destructor TWaterMarker.destroy;
    begin
       if assigned(Photo) then Photo.Free;
       if assigned(Watermark) then Watermark.Free;
       if assigned(Bmp) then Bmp.Free;
      inherited;
    end;
    
    procedure TWaterMarker.Render(bShowCopyRight: boolean;fontSize:single=20);
    const
      ColorMatrix: TColorMatrix =
      (
        (1.0, 0.0, 0.0, 0.0, 0.0),
        (0.0, 1.0, 0.0, 0.0, 0.0),
        (0.0, 0.0, 1.0, 0.0, 0.0),
        (0.0, 0.0, 0.0, 0.5, 0.0),
        (0.0, 0.0, 0.0, 0.0, 1.0)
      );
    var
      gp: TGpGraphics;
      imageAttr: TGpImageAttributes;
      strFormat: TGpStringFormat;
      font: TGpFont;
      x, y: Single;
    begin
       // 建立新位图的画布,并设置图像显示质量和文本显示质量
      if  (Not assigned(Bmp)) or (Bmp=nil) then Exit;
    
      gp := TGpGraphics.Create(Bmp);
      gp.SmoothingMode := smAntiAlias;
      gp.TextRenderingHint := thAntiAlias;
      // 在画布上画原始图片
      gp.DrawImage(Photo, GpRect(0, 0, PhWidth, PhHeight),
                   0, 0, PhWidth, PhHeight, utPixel);
      // 建立图像显示辅助类
      imageAttr := TGpImageAttributes.Create;
      // 设置透明颜色为水印图片四角的底色,水印图显示为圆角图片
      imageAttr.SetColorKey($ff00ff00, $ff00ff00, ctBitmap);
      // 设置水印图片不透明度为0.3
      imageAttr.SetColorMatrix(ColorMatrix, cfDefault, ctBitmap);
    
      // 在画布右下角画水印图
      gp.DrawImage(Watermark, GpRect(PhWidth - WmWidth - 10,PhHeight-WmHeight- 10, WmWidth, WmHeight), 0, 0, WmWidth, WmHeight, utPixel, imageAttr);
    
    
      if bShowCopyRight then
      begin
          // 设置文本字体和显示格式
          font := TGpFont.Create('arial', fontSize, [fsBold]);
          strFormat := TGpStringFormat.Create;
          strFormat.Alignment := saCenter;
          // 在画布下方居中显示阴影文本
          x := PhWidth / 2;
          y := PhHeight - 36;
          gp.DrawString(fCopyRight, font, Brushs[$99000000], x + 1, y + 1, strFormat);
          gp.DrawString(fCopyRight, font, Brushs[$99ffffff], x, y, strFormat);
    
          font.Free;
          strFormat.Free;
      end;
    
    
      imageAttr.Free;
      gp.Free;
    
    
    end;
    
    procedure TWaterMarker.save;
    var
      Clsid: TGUID;
      Parameters: TEncoderParameters;
      Quality: Integer;
    begin
    
      if not fileexists(fSourcePic) then   Exit;
      if (not assigned(Bmp))  or (Bmp=nil) then Exit;
    
      // 设置图像品质编码参数
      Parameters.Count := 1;
      Parameters.Parameter[0].Guid := EncoderQuality;
      Parameters.Parameter[0].ValueType := EncoderParameterValueTypeLong;
      Parameters.Parameter[0].NumberOfValues := 1;
      // 设置参数的值:品质等级,最高为100,图像文件大小与品质成正比
      Quality := 100;
      Parameters.Parameter[0].Value := @Quality;
    
     if GetEncoderClsid('image/jpeg', Clsid) then
         Bmp.Save(changefileext(fSourcePic,'_watermark.jpg'), Clsid, @Parameters);
    
    end;
    
    procedure TWaterMarker.setCopyRight(value: string);
    begin
      fCopyRight:=value;
    end;
    
    procedure TWaterMarker.setResolution(value: single);
    begin
       fResolution:=value;
    end;
    
    procedure TWaterMarker.setSourcePic(value:string);
    begin
        fSourcePic:=value;
    end;
    
    procedure TWaterMarker.setWaterMarkPic(value: string);
    begin
       fWaterMarkPic:=value;
    end;
    
    procedure TWaterMarker.Show(Handle: HDC);
    var
      g: TGpGraphics;
    begin
     //将生成的水印效果图像直接显示到handle所在的画布上
       g := TGpGraphics.Create(Handle);
       g.TranslateTransform(0, 0);
       g.DrawImage(bmp, 0, 0, PhWidth, PhHeight);
       g.Free;
    end;
    
    end.
    var WM: TWaterMarker;
    begin
      //  WM:=TWaterMarker.create('images/my.jpg','images/watermark.jpg');
        WM:=TWaterMarker.create();
        WM.SourcePic:='images/my.jpg';
        WM.WaterMarkPic:='images/watermark.jpg';
        WM.Resolution:=72;
    
        WM.prepare;
        WM.Render(true,30);
       // WM.save;
        WM.Show(self.Canvas.Handle);
    
        WM.Free ;
        WM:=nil;
        showmessage('ok');
    end;
  • 相关阅读:
    多级菜单 menu
    PHP 在线 编辑 解析
    [转]在PHP语言中使用JSON
    [转]SSIS ADO.NET vs OLEDB
    [转]SSIS高级转换任务—在Package中是用临时表是需要设置RetainSameConnection属性
    [转]SSIS高级转换任务—行计数
    [转]SSIS Recordset Destination
    [转]SSIS: By coding
    [转]SSIS cannot convert between unicode and non-unicode string
    [转]How to handle Failed Rows in a Data Flow
  • 原文地址:https://www.cnblogs.com/yzryc/p/6343430.html
Copyright © 2011-2022 走看看