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

Yun__ 2012-08-14 10:14:31
可以再XP下也能绘制发光字...

效果还不是很好.. 有些偏移.



算法还能改进

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();







}//写发光字

...全文
1239 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
china_jeffery 2013-10-25
  • 打赏
  • 举报
回复
mrsupersky 2013-01-19
  • 打赏
  • 举报
回复
哈哈,不错,谢谢分享,Mark一下,之前一直在疑惑怎么实现呢。
lkp1987hf919 2013-01-18
  • 打赏
  • 举报
回复
不错,mark
Yun__ 2012-08-17
  • 打赏
  • 举报
回复
这个文字显示方法并不是要很多时候出现。 。就是换肤不能确定下面色彩的时候 用这个方法。 就能看清字体罢了。 所以我觉得我的方法暂时是够用了
dylike 2012-08-17
  • 打赏
  • 举报
回复
补充一下,百度就不知道了,网上这方面的示例很少,我说的360度光源法,是早期时候为了实现投影而做的,原理是以每个文字的中心点为基准,以360度方向进行柔化扩散,也就是每个文字至少要画360*3次,效果不是太高,但这可以在任意字号的情况下显示很好的效果,当然,360度中,可以每隔几个角度画一次,这样就可以使绘制次数减少到一半。由于每次向指定角度绘制指定次数(发光宽度)的相同文字,所以在每个字的4个角不会出现像WIN7中那种(只出现文字中心的白,而文字超出白色部分的没有被绘制),当然,这是比较现实的做法了,毕竟没有见过哪家店的霓虹灯只是文字中间有点光,四个角的一撇一捺居然没有光。
dylike 2012-08-17
  • 打赏
  • 举报
回复
能做出这样的效果相当不错了,不过这也有个问题,通过系统自身来放大柔化后的色彩很淡,或说很透明,这使得发的光可能有些不是很明显。我倒是建议你使用360度光源法来做。
BoweirrKing 2012-08-16
  • 打赏
  • 举报
回复
又仔细试验了一下,此函数的效果和Windows自带的,还是有区别的。

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

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

不过按照你的这个思路,做的和Windows一样也不是难事了。
Yun__ 2012-08-16
  • 打赏
  • 举报
回复
大量文字绘制并不推荐 或者使用多缓冲方法 不然速度快了 绘制量一大 就是个大悲剧。。。
BoweirrKing 2012-08-16
  • 打赏
  • 举报
回复
顺便移植为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);
}
BoweirrKing 2012-08-16
  • 打赏
  • 举报
回复
我也试验了下,感觉效果和Windows自带的基本上是完全一样了。

不知道和Windows下的API的原理和你这个一样不? 确实挺巧妙的!赞一个!!
Yun__ 2012-08-16
  • 打赏
  • 举报
回复
我用的是WIN7 但是发光字在Aero效果比较好 但是XP也是绝对可以有用的
因为他并不是依靠系统主题绘制。可以做出QQ那样的发光字。。
我的边框也是自己绘制的。呵呵 ,, 纯手工。。 无图片、、、
BoweirrKing 2012-08-16
  • 打赏
  • 举报
回复
To楼主:

对话框的那种毛玻璃(Aero)效果,也是你自己用GDI+实现的吗?
isjoe 2012-08-15
  • 打赏
  • 举报
回复
你加点注释行不?
isjoe 2012-08-15
  • 打赏
  • 举报
回复
我试了试,还不错,挺好
newtee 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

推荐啊加精啊
[/Quote]小猴子
newtee 2012-08-14
  • 打赏
  • 举报
回复
不错 学习一下
Yun__ 2012-08-14
  • 打赏
  • 举报
回复
这个是普通winfrom都可以使用的。。。。。只要弄个标签在消息中绘制也是可以的
SocketUpEx 2012-08-14
  • 打赏
  • 举报
回复
推荐啊加精啊


lizhibin11 2012-08-14
  • 打赏
  • 举报
回复
艺术天分啊,很漂亮。
dandanzxy 2012-08-14
  • 打赏
  • 举报
回复
用WPF,设置Effect属性(Label的)就可以,有一个DropShadowEffect

110,580

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧