加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – .Net Graphicspath的包络失真

发布时间:2020-12-16 01:50:48 所属栏目:百科 来源:网络整理
导读:我正在试图找出将.net中的GraphicsPath扭曲到特定形状的最佳方法.我试图实现的结果是扭曲文本,使曲线向上,向下,扇形左,右和波浪之类的东西.所有这些都可以使用信封失真功能在Adobe Illustrator中实现. 我已经考虑使用一些预定义的网格和点映射系统来转换我自
我正在试图找出将.net中的GraphicsPath扭曲到特定形状的最佳方法.我试图实现的结果是扭曲文本,使曲线向上,向下,扇形左,右和波浪之类的东西.所有这些都可以使用信封失真功能在Adobe Illustrator中实现.

我已经考虑使用一些预定义的网格和点映射系统来转换我自己的方法来转换点.但是,似乎有一些算法或样本如何做到这一点已经可用?

解决方法

以下是我们使用的验证码生成器中的几种方法,它们可能会引导您朝着正确的方向前进:

internal static void DrawPhrase(
        this Graphics graphics,int width,int height,string phrase)
    {
        graphics.FillRectangle(
            Brushes.White,width,height);

        using (var gp = new GraphicsPath())
        {
            gp.AddString(phrase,FontFamily.GenericMonospace,(int)FontStyle.Bold,33f,new Point(0,0),StringFormat.GenericTypographic);

            using (var gpp = gp.Deform(width,height))
            {
                var bounds = gpp.GetBounds();
                var matrix = new Matrix();
                var x = (width - bounds.Width) / 2 - bounds.Left;
                var y = (height - bounds.Height) / 2 - bounds.Top;
                matrix.Translate(x,y);
                gpp.Transform(matrix);
                graphics.FillPath(Brushes.Black,gpp);
            }
        }

        graphics.Flush();
    }
    internal static GraphicsPath Deform(
        this GraphicsPath path,int height)
    {
        var WarpFactor = 4;
        var xAmp = WarpFactor * width / 300d;
        var yAmp = WarpFactor * height / 50d;
        var xFreq = 2d * Math.PI / width;
        var yFreq = 2d * Math.PI / height;
        var deformed = new PointF[path.PathPoints.Length];
        var xSeed = rng.NextDouble() * 2 * Math.PI;
        var ySeed = rng.NextDouble() * 2 * Math.PI;
        var i = 0;
        foreach (var original in path.PathPoints)
        {
            var val = xFreq * original.X + yFreq * original.Y;
            var xOffset = (int)(xAmp * Math.Sin(val + xSeed));
            var yOffset = (int)(yAmp * Math.Sin(val + ySeed));
            deformed[i++] = new PointF(original.X + xOffset,original.Y + yOffset);
        }

        return new GraphicsPath(deformed,path.PathTypes);
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读