Delphi实现悬浮的卡拉OK字幕 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,文字透明的效果就出来了。

http://www.cnblogs.com/hssbsw/archive/2012/06/03/2533088.html

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