首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

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

2013-01-23 
XP可用的GDI+发光字画法...算法还能改进 public void Luminous(Graphics g, int Fuzzy, Rectangle Rect, s

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中那种(只出现文字中心的白,而文字超出白色部分的没有被绘制),当然,这是比较现实的做法了,毕竟没有见过哪家店的霓虹灯只是文字中间有点光,四个角的一撇一捺居然没有光。

热点排行