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,文字透明的效果就出来了。
GDI+ 实现透明水印和文字的更多相关文章
- java常用开发工具类之 图片水印,文字水印,缩放,补白工具类
import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...
- PHP 透明水印生成代码
PHP 透明水印生成代码,需要的朋友可以参考下. 复制代码代码如下: <?php /* * Created on 2010-10-27 * BY QQ542900563 * Copyri ...
- 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)
javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 javaCV图像处理之2:实时视频添加图片水 ...
- Java给图片和PDF文件添加水印(图片水印和文字水印)
有时候我们看到的图片或者PDF文件会自动加上水印.分为文字水印和图片水印. ----------------------------图片水印---------------------------- 1 ...
- Thinkphp图片水印和文字水印
1.Thinkphp图像处理 在TP框架中,我们经常用到图片上传,我最近写了很多关于图片上传的文章,thinkphp图片上传+validate表单验证+图片木马检测+缩略图生成等文章,今天写一下关于图 ...
- WPF Windows背景透明其中的文字保持不透明
原文:WPF Windows背景透明其中的文字保持不透明 版权声明:本文为博主原创,未经允许不得转载.交流.源码资料加群:161154103 https://blog.csdn.net/mpegfou ...
- PHP给图片加上图片水印和文字水印实例
下面给大家分享一下PHP给图片加上图片水印和文字水印实例,这也是网站经常用到的功能,把代码加上去,调用就很简单了. 核心代码: function imageWaterMark($groundImage ...
- C# GDI+ 简单实现图片写文字和图片叠加(水印)(转)
using System; using System.Collections; using System.Configuration; using System.Data; using System. ...
- php对图片加水印--将文字作为水印加到图片
方法代码: /** * 图片加水印(适用于png/jpg/gif格式) * * @author flynetcn * * @param $srcImg 原图片 * @param $wat ...
随机推荐
- CRM 2016 执行IFrame 子页面中函数
CRM代码: var iframe = Xrm.Page.getControl("IFRAME_xxx").getObject(); iframe.contentWindow.Re ...
- 第11章 拾遗1:网络地址转换(NAT)和端口映射
1. 网络地址转换(NAT) 1.1 NAT的应用场景 (1)应用场景:允许将私有IP地址映射到公网地址,以减缓IP地址空间的消耗 ①需要连接Internet,但主机没有公网IP地址 ②更换了一个新的 ...
- ThreadException
在windows窗体程序中,使用 ThreadException 事件来处理 UI 线程异常,使用 UnhandledException 事件来处理非 UI 线程异常.ThreadException可 ...
- make install 时指定安装路径
The make install target dir is representationed by var : DESTDIR, if we set this var to the locati ...
- dataset to list
http://www.c-sharpcorner.com/UploadFile/ee01e6/different-way-to-convert-datatable-to-list/ http://ww ...
- C# 中使用锁防止多线程冲突
在编程的时候经常会用到多线程,有时候如果多线程操作同一个资源就会导致冲突,.NET提供了多种方法来防止冲突发生,这里讲下Mutex 该类位于System.Threading命名空间,常用的方式是这样: ...
- CVPR 2019 | 用异构卷积训练深度CNN:提升效率而不损准确度
对于深度卷积神经网络而言,准确度和计算成本往往难以得兼,研究界也一直在探索通过模型压缩或设计新型高效架构来解决这一问题.印度理工学院坎普尔分校的一篇 CVPR 论文则给出了一个新的思路——使用异构的卷 ...
- Linux交换空间(swap space)
每次安装Linux的时候,都会要求配置交换分区,那么这个分区是干嘛的呢?不设置这个分区有什么后果?如果一定要设置,设置多大比较合适?本篇将试图回答这些问题并尽量覆盖所有swap相关的知识. 下面的所有 ...
- Solr查询参数sort(排序)
摘要: Solr查询每一次返回的数据都有一定的顺序,特定顺序的结果对于业务来说可能非常重要. 不指定排序 一般我们不指定排序规则,这样的结果能满足大部分需求,默认是用文档的得分作为排序标准.相当于加上 ...
- SP8093 JZPGYZ - Sevenk Love Oimaster(SAM)
/* 打模板题啊 每个串影响到的集合直接枚举跳parent处理即可 */ #include<cstdio> #include<algorithm> #include<cs ...