使用C#中的GDI+功能实现图片填充验证方式

  CSDN网站中的找回密码功能中,需要用户滑动图片补全图片中的不完整部分,通过这种方式来进行验证,只有通过验证才能进行下一步操作。
这里写图片描述
  使用C#的GDI+功能也可以实现类似的功能。要实现该功能需要完成几下几方面的工作:
  1)创建待填充区域
  这个区域一般是不规则区域,上图中的区域类似于哑铃。创建不规则填充区域可以使用GraphicsPath类,该类可以将多类图形组合在一起,示例代码中实现的是一个长方形,外加左右两边一边一个半圆,直接用线条和弧线拼起来的,代码如下:

        private const int RECT_WIDTH = 50;
        private const int RECT_HEIGHT = 30;
        private const int ARC_RADIUS = 5;

        private void InitGraphicsPath()
        {
            m_clipRegion.AddLine(ARC_RADIUS, 0, ARC_RADIUS + RECT_WIDTH, 0);
            m_clipRegion.AddLine(ARC_RADIUS + RECT_WIDTH, 0, ARC_RADIUS + RECT_WIDTH, RECT_HEIGHT / 2 - ARC_RADIUS);                      
            m_clipRegion.AddArc(RECT_WIDTH, 10, ARC_RADIUS * 2, ARC_RADIUS * 2, -90, 90);           
            m_clipRegion.AddLine(ARC_RADIUS + RECT_WIDTH, RECT_HEIGHT / 2 + ARC_RADIUS, ARC_RADIUS + RECT_WIDTH, RECT_HEIGHT);
            m_clipRegion.AddLine(ARC_RADIUS + RECT_WIDTH, RECT_HEIGHT, ARC_RADIUS, RECT_HEIGHT);
            m_clipRegion.AddLine(ARC_RADIUS, RECT_HEIGHT, ARC_RADIUS, RECT_HEIGHT / 2 + ARC_RADIUS);
            m_clipRegion.AddArc(0, 10, ARC_RADIUS * 2, ARC_RADIUS * 2, 90, 270);            
            m_clipRegion.AddLine(ARC_RADIUS, RECT_HEIGHT / 2 - ARC_RADIUS, ARC_RADIUS, 0);
        }

  2)在图片中绘制待填充区域
  这个可以调用Graphics的FillPath函数来实现,示例程序中填充区域的位置在Y方向是固定的,X方向随机生成。
  3)获取填充区域的图形
  一般将填充区域的图形放在图形左侧,然后移动图形下方的滑块来进行图形填充。由于填充区域是不规则形状,将填充区域的图形扣出来可以采用以下两种方式:
  a)使用Bitmap类型的Clone方法获取指定区域的图形,该函数的原型为:

public Bitmap Clone(Rectangle rect, PixelFormat format);

  矩形即包含不规则区域的最小矩形。使用该函数返回的是一个矩形区域,还需要创建一个同样尺寸的空白图片,然后设置该图片的剪切区域,最后再把Clone函数返回的图形绘制到空白图形中。
  b)创建一个空白图片,设置图片的剪切区域,然后直接调用Graphics中的DrawImage将原图中的填充区域图形绘制到空白图形中,代码如下:

using (Graphics g = Graphics.FromImage(m_cuttedImage))
{
    g.Clip = new System.Drawing.Region(m_unfilledRegion.ClipRegion);
    g.DrawImage(UserValidationOfFillingImage.Properties.Resources.hehua,
         0, 0, new Rectangle(m_unfilledRegionStartX, UNFILLED_RERION_START_Y, m_cuttedImage.Width, m_cuttedImage.Height), GraphicsUnit.Pixel);
}

  上述三个方面的功能实现后,剩余的就是实现鼠标拖动滑块进行图片填充验证,如果将填充区域的图形移动到了图片的填充区域,则验证成功,否则验证失败。示例程序的截图如下:
这里写图片描述
这里写图片描述

示例代码地址:https://github.com/guochao2299/UserValidationOfFillingImage

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值