读书人

XP可用的GDI+发光墨宝法.

发布时间: 2013-01-23 10:44:50 作者: rapoo

XP可用的GDI+发光字画法...


算法还能改进

public void Luminous(Graphics g, int Fuzzy, Rectangle Rect, string Text, Rectangle Textrect, Font Font, int FontColor, int ShadowColor)
{

Bitmap Bit1 = new Bitmap(Rect .Width , Rect .Height , System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Graphics g1 = Graphics.FromImage(Bit1);
g1.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g1.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
g1.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.AssumeLinear;
Bitmap Bit2 = new Bitmap(Rect.Width / Fuzzy, Rect.Height / Fuzzy, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Graphics g2 = Graphics.FromImage(Bit2);
g2.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g2.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.None;
//布局

int cb = ShadowColor / 65536;
int cg = (ShadowColor - cb* 65536) / 256;
int cr = ShadowColor - (cb * 65536) - (cg * 256);

SolidBrush B = new SolidBrush (Color .FromArgb (255,cr,cg,cb));
GraphicsPath path = new GraphicsPath();

path.AddString(Text, Font.FontFamily, (int)(FontStyle.Bold), Font.Size, Textrect , new StringFormat());
g1.FillPath(B, path);
path.Dispose();
//绘制文字

Auxiliary_Console.ts1(Fuzzy.ToString());
g2.DrawImage(Bit1 ,0,0,Rect .Width / Fuzzy ,Rect .Height /Fuzzy );
g1.Clear(Color .FromArgb (0));
g1.DrawImage(Bit2, 0, 0, Rect.Width, Rect.Height);


g1.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
//发光字底图

GraphicsPath path1 = new GraphicsPath();
path1.AddString(Text, Font.FontFamily, (int)(FontStyle.Bold), Font.Size, Textrect, new StringFormat());


cb = FontColor / 65536;
cg = (FontColor - cb * 65536) / 256;
cr = FontColor - (cb * 65536) - (cg * 256);

B.Color = Color.FromArgb(255, cr, cg, cb);
g1.FillPath(B, path1);
path.Dispose();
//绘制文字

g.DrawImage(Bit1, Rect.X, Rect.Y );
g1.Dispose();
g2.Dispose();
Bit1.Dispose();
Bit2.Dispose();
B.Dispose();







}//写发光字



[解决办法]

引用:
推荐啊加精啊
小猴子
[解决办法]
我试了试,还不错,挺好
[解决办法]
你加点注释行不?
[解决办法]
To楼主:

对话框的那种毛玻璃(Aero)效果,也是你自己用GDI+实现的吗?
[解决办法]
我也试验了下,感觉效果和Windows自带的基本上是完全一样了。

不知道和Windows下的API的原理和你这个一样不? 确实挺巧妙的!赞一个!!
[解决办法]
顺便移植为C++代码,VC6测试通过:
(代码版权归楼主qq6648208281所有,哈哈)


void Luminous(Graphics &g, int Fuzzy, Rect rectPaint, LPCWSTR Text, Rect Textrect, Font &TextFont, int FontColor, int ShadowColor)


{
Bitmap Bit1(rectPaint.Width, rectPaint.Height);
Graphics g1(&Bit1);
g1.SetSmoothingMode(SmoothingModeAntiAlias);
g1.SetTextRenderingHint(TextRenderingHintAntiAlias);
g1.SetCompositingQuality(CompositingQualityAssumeLinear);
Bitmap Bit2(rectPaint.Width / Fuzzy, rectPaint.Height/ Fuzzy);
Graphics g2(&Bit2);
g2.SetInterpolationMode(InterpolationModeHighQualityBicubic);
g2.SetPixelOffsetMode(PixelOffsetModeNone);
//布局

int cb = ShadowColor / 65536;
int cg = (ShadowColor - cb * 65536) / 256;
int cr = ShadowColor - (cb * 65536) - (cg * 256);

SolidBrush B(Color(255, cr, cg, cb));
GraphicsPath path;

FontFamily ftFamily;
TextFont.GetFamily(&ftFamily);
path.AddString(Text,-1,&ftFamily , (int)(FontStyleBold), TextFont.GetSize(), Textrect,NULL);
g1.FillPath(&B, &path);
//绘制文字

g2.DrawImage(&Bit1, 0, 0, rectPaint.Width/ Fuzzy, rectPaint.Height / Fuzzy);
g1.Clear(Color(0));
g1.DrawImage(&Bit2, 0, 0, rectPaint.Width, rectPaint.Height);
g1.SetTextRenderingHint(TextRenderingHintAntiAlias);
//发光字底图

GraphicsPath path1;
path1.AddString(Text,-1,&ftFamily, (int)(FontStyleBold),TextFont.GetSize(), Textrect,NULL/* new StringFormat()*/);


cb = FontColor / 65536;
cg = (FontColor - cb * 65536) / 256;
cr = FontColor - (cb * 65536) - (cg * 256);

B.SetColor(Color(255, cr, cg, cb));
g1.FillPath(&B, &path1);
//绘制文字

g.DrawImage(&Bit1, rectPaint.X, rectPaint.Y);
}


[解决办法]
又仔细试验了一下,此函数的效果和Windows自带的,还是有区别的。

当要绘制的文字的字体字号比较小时,肉眼基本看不出来区别。

但是当把文字放大到48号字的时候,就能明显看出来不同了。

不过按照你的这个思路,做的和Windows一样也不是难事了。
[解决办法]
能做出这样的效果相当不错了,不过这也有个问题,通过系统自身来放大柔化后的色彩很淡,或说很透明,这使得发的光可能有些不是很明显。我倒是建议你使用360度光源法来做。
[解决办法]
补充一下,百度就不知道了,网上这方面的示例很少,我说的360度光源法,是早期时候为了实现投影而做的,原理是以每个文字的中心点为基准,以360度方向进行柔化扩散,也就是每个文字至少要画360*3次,效果不是太高,但这可以在任意字号的情况下显示很好的效果,当然,360度中,可以每隔几个角度画一次,这样就可以使绘制次数减少到一半。由于每次向指定角度绘制指定次数(发光宽度)的相同文字,所以在每个字的4个角不会出现像WIN7中那种(只出现文字中心的白,而文字超出白色部分的没有被绘制),当然,这是比较现实的做法了,毕竟没有见过哪家店的霓虹灯只是文字中间有点光,四个角的一撇一捺居然没有光。

读书人网 >C#

热点推荐