最近给《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,文字透明的效果就出来了。

GDI+ 实现透明水印和文字的更多相关文章

  1. java常用开发工具类之 图片水印,文字水印,缩放,补白工具类

    import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...

  2. PHP 透明水印生成代码

    PHP 透明水印生成代码,需要的朋友可以参考下. 复制代码代码如下: <?php  /*  * Created on 2010-10-27  * BY QQ542900563  * Copyri ...

  3. 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)

    javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 javaCV图像处理之2:实时视频添加图片水 ...

  4. Java给图片和PDF文件添加水印(图片水印和文字水印)

    有时候我们看到的图片或者PDF文件会自动加上水印.分为文字水印和图片水印. ----------------------------图片水印---------------------------- 1 ...

  5. Thinkphp图片水印和文字水印

    1.Thinkphp图像处理 在TP框架中,我们经常用到图片上传,我最近写了很多关于图片上传的文章,thinkphp图片上传+validate表单验证+图片木马检测+缩略图生成等文章,今天写一下关于图 ...

  6. WPF Windows背景透明其中的文字保持不透明

    原文:WPF Windows背景透明其中的文字保持不透明 版权声明:本文为博主原创,未经允许不得转载.交流.源码资料加群:161154103 https://blog.csdn.net/mpegfou ...

  7. PHP给图片加上图片水印和文字水印实例

    下面给大家分享一下PHP给图片加上图片水印和文字水印实例,这也是网站经常用到的功能,把代码加上去,调用就很简单了. 核心代码: function imageWaterMark($groundImage ...

  8. C# GDI+ 简单实现图片写文字和图片叠加(水印)(转)

    using System; using System.Collections; using System.Configuration; using System.Data; using System. ...

  9. php对图片加水印--将文字作为水印加到图片

    方法代码: /**  * 图片加水印(适用于png/jpg/gif格式)  *  * @author flynetcn  *  * @param $srcImg  原图片  * @param $wat ...

随机推荐

  1. ubuntu14.04安装telnet

    1.首先查看telnet运行状态 netstat -a | grep telnet 输出为空,表示没有开启该服务 2.安装openbsd-inetd apt-get install openbsd-i ...

  2. C#连接数据库最基本操作之sql语句 DML

    C#连接数据库最基本操作之sql语句 DML //1 连接字符串 string connectionString = "server=127.0.0.1;integrated securit ...

  3. Javascript-关于null、undefined、空字符串的区分

    一.分别判断 var a=null; //var a=undefined; //var a=''; //var a='DD'; if(!a&&typeof a == 'object') ...

  4. datagrid行内编辑时为datetimebox

    $.extend($.fn.datagrid.defaults.editors, { datetimebox: {// datetimebox就是你要自定义editor的名称 init: functi ...

  5. 'ascii' codec can't decode byte 0xd6 in position 0

    使用elastalert,执行python文件时报错: 经查,python命令下输出中文字符时需要将编码指定为gb2312,一开始博主也不知道是输出在控制台的信息编码格式问题,一直以为是博主自己的ya ...

  6. WPF DataGrid多表头/列头,多行头,合并单元格,一列占据多行

    先上效果图: 思路说明:这是两个DataGrid,没有嵌套,位置和高度保持一致,在加上ScrollViewer滚动条,这就像是在一个DataGrid中. 缺点: 因为最外层有透明的Border,所以没 ...

  7. Mac安装compass失败的原因

    之前一直用的windows电脑,突然间切换成mac,各种不习惯,刚开始的时候连文件夹都找不到,悲催…… 还好,熟悉了两天之后,基本上也能够操作了. 然后就是安装各种开发软件,由于个人习惯了使用sass ...

  8. ES6学习笔记<四> default、rest、Multi-line Strings

    default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...

  9. Jquery,全选,反选,

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. [转] 高频 mos 选择需要考虑相关资料

    节选自 http://www.dianyuan.com/bbs/987183.html [草根大侠]贴 关于MOS管导通内阻和米勒电容(Qgd)差异对效率的影响 http://www.epc.com. ...