zoukankan      html  css  js  c++  java
  • GDI+ 实现透明水印和文字

    最近给《JPEG浏览缩放器》增加了水印功能,在设计的过程中,参考了网上的文章,但是发现文章使用的GDI+ API封装包不是我现在使用的那一套,目前DELPHI使用的GDI+ API封装包有两套,一套包括以DirectDraw.*、Gdipapi.*、Gdipobj.*、 Gdiputil.*为文件名,另一套以GdipExport.*、Gdiplus.*、GdipTypes.*、GdipUtil.*为文件名,我使用的是前者,文章所用的是后者,于是将文章原代码根据我用的那套GDI+ API封装包进行修改,修改后的代码如下:

    USES GDIPUTIL,GDIPAPI,GDIPOBJ;

    procedure  Form1.SaveJpg(sname,Dname:string);

    //Sname-源JPEG文件名,Dname-加水印后的JPEG文件名

     const

      ColorMatrix: TColorMatrix =
      ( //R    G    B    A    V
        (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.3, 0.0),
        (0.0, 0.0, 0.0, 0.0, 1.0)
      );
    var
        font1: TGPFont;
        bmp,Watermark:TGPBitmap;
        g: TGPGraphics;
        sb1: TGPSolidBrush;
        imageAttr:TGpImageAttributes;
        JPG: TGPImage;
        strFormat: TGpStringFormat;
        EncoderClsid:   TGUID;
        Parameters: TEncoderParameters;
        Quality: Integer;

    begin

       //载入JPEG图片
       jpg:=TGPimage.Create(sname); 
      //根据JPEG图片的SIZE创建一个BMP 
       Bmp := TGPBitmap.Create(jpg.GetWidth,jpg.GetHeight,   PixelFormat32bppRGB);

     //绘制JPEG底图
       g := TGPGraphics.Create(BMP);  
       g.SetInterpolationMode(InterpolationModeHighQualityBicubic); 
      g.DrawImage(Jpg, MakeRect(0, 0, Jpg.GetWidth,,Jpg.GetHeight), 0, 0, Jpg.GETwidth, Jpg.GETheight, UnitPixel);

    //使用IMAGE控件里的BMP格式图片做水印图 
      Watermark:=TGPBitmap.Create(Image1.Picture.Bitmap.Handle, PixelFormat32bppRGB);
       

    // 设置水印的透明度为0.3(根据ColorMatrix的[3][3]=0.3)
       imageAttr := TGpImageAttributes.Create;
       imageAttr.SetColorMatrix(ColorMatrix:);

      //绘制水印,位置在原图的左上角X=20,Y=20位,强制大小为100*100。
     g.DrawImage(Watermark, MakeRec(20,20,     100,100),0, 0 
                            Image1.Picture.Bitmap.Width,Image1.Picture.Bitmap.Height ,  UnitPixel, imageAttr);

    //加入水印文字

    font1 := TGpFont.Create('黑体',20);

    sb1 := TGPSolidBrush.Create($50000000); //黑色阴影打底
    sb2 := TGPSolidBrush.Create($50FFFFFF); //白色字在上面

    strFormat := TGpStringFormat.Create;
    strFormat.SetAlignment(StringAlignmentNear);

    //分别用黑色和白色错开1个象素绘制文字,产生阴影效果.

    g.DrawString('冲瞳软件工作室',7,font1,MakeRect(151,21,Jpg.GetWidth /1,Jpg.GetHeight),strFormat,sb1);
    g.DrawString('冲瞳软件工作室',7,font1,MakeRect(150,20,Jpg.GetWidth /1,Jpg.GetHeight),strFormat,sb1);

     // ------设置图像品质编码参数,保存文件---------------------
        Quality :=90;
        Parameters.Count := 1;
        Parameters.Parameter[0].Guid := EncoderQuality;
        Parameters.Parameter[0].Type_:= EncoderParameterValueTypeLong;
        Parameters.Parameter[0].NumberOfValues := 1;
        // 设置参数的值:品质等级,最高为100,图像文件大小与品质成正比
        Parameters.Parameter[0].Value := @Quality;
        GetEncoderClsid('image/jpeg'',   EncoderClsid);
        Bmp.Save(dname, EncoderClsid, @Parameters);

    //释放 
     sb1.Free; 
      font1.Free; 
     strFormat.Free;
     jpg.Free; 
     bmp.Free; 
     ImageAttr.Free; 
     Watermark.Free; 
     g.Free;

    end;

            在网上的文章中,TGPSolidBrush.Create($50000000); 这条函数用的参数是$99000000,绘制的文字是不透明的,而在网上也没有搜索到绘制透明文字的代码,一度使我认为要使文字透明,必须先保存成图片,再用绘制水印的方法实现,后来想了一下,是不是ARBG的A(透明度)太大了呢,在GDI+中,使用ARBG,$99000000表示A=$99,试将颜色的A都改成$50,文字透明的效果就出来了。

  • 相关阅读:
    数据结构-树与二叉树-思维导图
    The last packet successfully received from the server was 2,272 milliseconds ago. The last packet sent successfully to the server was 2,258 milliseconds ago.
    idea连接mysql报错Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property
    redis学习笔记
    AJAX校验注册用户名是否存在
    AJAX学习笔记
    JSON学习笔记
    JQuery基础知识学习笔记
    Filter、Listener学习笔记
    三层架构学习笔记
  • 原文地址:https://www.cnblogs.com/yzryc/p/6401819.html
Copyright © 2011-2022 走看看