zoukankan      html  css  js  c++  java
  • 图像处理:遮罩

    http://www.tomore.com/4/3764.html

    画透明位图通常的方法是使用遮罩。所谓遮罩就是一张黑白双色的位图,他和要透明的位图是对应的,遮罩描述了位图中需要透明的部分,透明的部分是黑色的,而不透明的是白色的,白色的部分就是透明的部分。

    假设图A是要画的透明位图,图B是遮罩,图A上是一个大写字母A,字母是红色的,背景是黑色的,图B背景是白色的,上面有一个黑色的字母A和图A的形状是一样的。

    比如我们要在一张蓝天白云的背景上透明地画图A,就是只把红色的字母A画上去。我们可以先将图B和背景进行与操作,再把图B和背景进行或操作就可以了。

    用VC++ MFC实现的代码如下:
    void CDemoDlg::OnPaint()
    {
    CPaintDC dc(this);
    CBitmap BmpBack,BmpA,BmpB,*pOldBack,*pOldA,*pOldB;

    BmpBack.LoadBitmap(IDB_BACKGROUND); // 载入背景图
    BmpA.LoadBitmap(IDB_BITMAPA); //载入图A
    BmpB.LoadBitmap(IDB_BITMAPB); //载入图B

    CDC dcBack,dcA,dcB; //声明三个内存DC用于画图
    dcBack.CreateCompatibleDC(&dc);
    dcA.CreateCompatibleDC(&dc);
    dcB.CreateCompatibleDC(&dc); //把这三个内存DC创建成和PaintDC兼容的DC

    pOldBack=dcBack.SelectObject(&BmpBack);
    pOldA=dcA.SelectObject(&BmpA);
    pOldB=dcB.SelectObject(&BmpB); //把三个位图选入相应的DC

    dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY); //画背景
    dc.BitBlt(0,0,48,48,&dcB,0,0,SRCAND); //用与的方式画遮罩图B
    dc.BitBlt(0,0,48,48,&dcA,0,0,SRCPAINT); //用或的方式画遮图A

    dcBack.SelectObject(pOldBack);
    dcBack.SelectObject(pOldA);
    dcBack.SelectObject(pOldB); //从内存DC中删除位图
    }

    你会看到红色的字母A透明地画在背景上了。

    用遮罩的方法必须事先做好遮罩,遮罩和位图大小一样等于多消耗一倍的资源,比较浪费。还有一种画透明位图的方法,基本原理是一样的,只是不用事先做好遮罩,根据需要动态生成遮罩,但是要求需要透明的位图必须指定一种透明色,凡是这个透明色的地方则画成透明的。

    用VC++ MFC实现的代码如下:
    /*
    这是一个用来画透明位图的函数
    CDC *pDC 需要画位图的CDC指针
    UINT IDImage 位图资源ID
    CRect &rect 指定位图在pDC中的位置
    COLORREF rgbMask 位图的透明色
    */
    void DrawTransparentBitmap(CDC *pDC, UINT IDImage,CRect &rect, COLORREF rgbMask)
    {
    CDC ImageDC,MaskDC;

    CBitmap Image,*pOldImage;
    CBitmap maskBitmap,*pOldMaskDCBitmap ;

    Image.LoadBitmap(IDImage);
    ImageDC.CreateCompatibleDC(pDC);
    pOldImage=ImageDC.SelectObject(&Image);

    MaskDC.CreateCompatibleDC(pDC);
    maskBitmap.CreateBitmap( rect.Width(), rect.Height(), 1, 1, NULL );
    pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap );

    ImageDC.SetBkColor(rgbMask);
    MaskDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &ImageDC, 0, 0, SRCCOPY );

    ImageDC.SetBkColor(#000000);
    ImageDC.SetTextColor(#ffffff);
    ImageDC.BitBlt(0, 0, rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);

    pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
    pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &ImageDC, 0, 0,SRCPAINT);

    MaskDC.SelectObject(pOldMaskDCBitmap);
    ImageDC.SelectObject(pOldImage);
    }

    void CDemoDlg::OnPaint()
    {
    CPaintDC dc(this);

    CBitmap BmpBack,*pOldBack,;
    BmpBack.LoadBitmap(IDB_BACKGROUND);

    CDC dcBack;
    dcBack.CreateCompatibleDC(&dc);
    pOldBack=dcBack.SelectObject(&BmpBack);

    dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY);
    DrawTransparentBitmap(&dc,IDB_BITMAPA,CRect(0,0,48,48),#c0c000);

    dcBack.SelectObject(pOldBack);
    }
    http://www.tomore.com/4/3764.html

    画透明位图通常的方法是使用遮罩。所谓遮罩就是一张黑白双色的位图,他和要透明的位图是对应的,遮罩描述了位图中需要透明的部分,透明的部分是黑色的,而不透明的是白色的,白色的部分就是透明的部分。

    假设图A是要画的透明位图,图B是遮罩,图A上是一个大写字母A,字母是红色的,背景是黑色的,图B背景是白色的,上面有一个黑色的字母A和图A的形状是一样的。

    比如我们要在一张蓝天白云的背景上透明地画图A,就是只把红色的字母A画上去。我们可以先将图B和背景进行与操作,再把图B和背景进行或操作就可以了。

    用VC++ MFC实现的代码如下:
    void CDemoDlg::OnPaint()
    {
    CPaintDC dc(this);
    CBitmap BmpBack,BmpA,BmpB,*pOldBack,*pOldA,*pOldB;

    BmpBack.LoadBitmap(IDB_BACKGROUND); // 载入背景图
    BmpA.LoadBitmap(IDB_BITMAPA); //载入图A
    BmpB.LoadBitmap(IDB_BITMAPB); //载入图B

    CDC dcBack,dcA,dcB; //声明三个内存DC用于画图
    dcBack.CreateCompatibleDC(&dc);
    dcA.CreateCompatibleDC(&dc);
    dcB.CreateCompatibleDC(&dc); //把这三个内存DC创建成和PaintDC兼容的DC

    pOldBack=dcBack.SelectObject(&BmpBack);
    pOldA=dcA.SelectObject(&BmpA);
    pOldB=dcB.SelectObject(&BmpB); //把三个位图选入相应的DC

    dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY); //画背景
    dc.BitBlt(0,0,48,48,&dcB,0,0,SRCAND); //用与的方式画遮罩图B
    dc.BitBlt(0,0,48,48,&dcA,0,0,SRCPAINT); //用或的方式画遮图A

    dcBack.SelectObject(pOldBack);
    dcBack.SelectObject(pOldA);
    dcBack.SelectObject(pOldB); //从内存DC中删除位图
    }

    你会看到红色的字母A透明地画在背景上了。

    用遮罩的方法必须事先做好遮罩,遮罩和位图大小一样等于多消耗一倍的资源,比较浪费。还有一种画透明位图的方法,基本原理是一样的,只是不用事先做好遮罩,根据需要动态生成遮罩,但是要求需要透明的位图必须指定一种透明色,凡是这个透明色的地方则画成透明的。

    用VC++ MFC实现的代码如下:
    /*
    这是一个用来画透明位图的函数
    CDC *pDC 需要画位图的CDC指针
    UINT IDImage 位图资源ID
    CRect &rect 指定位图在pDC中的位置
    COLORREF rgbMask 位图的透明色
    */
    void DrawTransparentBitmap(CDC *pDC, UINT IDImage,CRect &rect, COLORREF rgbMask)
    {
    CDC ImageDC,MaskDC;

    CBitmap Image,*pOldImage;
    CBitmap maskBitmap,*pOldMaskDCBitmap ;

    Image.LoadBitmap(IDImage);
    ImageDC.CreateCompatibleDC(pDC);
    pOldImage=ImageDC.SelectObject(&Image);

    MaskDC.CreateCompatibleDC(pDC);
    maskBitmap.CreateBitmap( rect.Width(), rect.Height(), 1, 1, NULL );
    pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap );

    ImageDC.SetBkColor(rgbMask);
    MaskDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &ImageDC, 0, 0, SRCCOPY );

    ImageDC.SetBkColor(#000000);
    ImageDC.SetTextColor(#ffffff);
    ImageDC.BitBlt(0, 0, rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);

    pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
    pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &ImageDC, 0, 0,SRCPAINT);

    MaskDC.SelectObject(pOldMaskDCBitmap);
    ImageDC.SelectObject(pOldImage);
    }

    void CDemoDlg::OnPaint()
    {
    CPaintDC dc(this);

    CBitmap BmpBack,*pOldBack,;
    BmpBack.LoadBitmap(IDB_BACKGROUND);

    CDC dcBack;
    dcBack.CreateCompatibleDC(&dc);
    pOldBack=dcBack.SelectObject(&BmpBack);

    dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY);
    DrawTransparentBitmap(&dc,IDB_BITMAPA,CRect(0,0,48,48),#c0c000);

    dcBack.SelectObject(pOldBack);
    }
    http://www.tomore.com/4/3764.html

    画透明位图通常的方法是使用遮罩。所谓遮罩就是一张黑白双色的位图,他和要透明的位图是对应的,遮罩描述了位图中需要透明的部分,透明的部分是黑色的,而不透明的是白色的,白色的部分就是透明的部分。

    假设图A是要画的透明位图,图B是遮罩,图A上是一个大写字母A,字母是红色的,背景是黑色的,图B背景是白色的,上面有一个黑色的字母A和图A的形状是一样的。

    比如我们要在一张蓝天白云的背景上透明地画图A,就是只把红色的字母A画上去。我们可以先将图B和背景进行与操作,再把图B和背景进行或操作就可以了。

    用VC++ MFC实现的代码如下:
    void CDemoDlg::OnPaint()
    {
    CPaintDC dc(this);
    CBitmap BmpBack,BmpA,BmpB,*pOldBack,*pOldA,*pOldB;

    BmpBack.LoadBitmap(IDB_BACKGROUND); // 载入背景图
    BmpA.LoadBitmap(IDB_BITMAPA); //载入图A
    BmpB.LoadBitmap(IDB_BITMAPB); //载入图B

    CDC dcBack,dcA,dcB; //声明三个内存DC用于画图
    dcBack.CreateCompatibleDC(&dc);
    dcA.CreateCompatibleDC(&dc);
    dcB.CreateCompatibleDC(&dc); //把这三个内存DC创建成和PaintDC兼容的DC

    pOldBack=dcBack.SelectObject(&BmpBack);
    pOldA=dcA.SelectObject(&BmpA);
    pOldB=dcB.SelectObject(&BmpB); //把三个位图选入相应的DC

    dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY); //画背景
    dc.BitBlt(0,0,48,48,&dcB,0,0,SRCAND); //用与的方式画遮罩图B
    dc.BitBlt(0,0,48,48,&dcA,0,0,SRCPAINT); //用或的方式画遮图A

    dcBack.SelectObject(pOldBack);
    dcBack.SelectObject(pOldA);
    dcBack.SelectObject(pOldB); //从内存DC中删除位图
    }

    你会看到红色的字母A透明地画在背景上了。

    用遮罩的方法必须事先做好遮罩,遮罩和位图大小一样等于多消耗一倍的资源,比较浪费。还有一种画透明位图的方法,基本原理是一样的,只是不用事先做好遮罩,根据需要动态生成遮罩,但是要求需要透明的位图必须指定一种透明色,凡是这个透明色的地方则画成透明的。

    用VC++ MFC实现的代码如下:
    /*
    这是一个用来画透明位图的函数
    CDC *pDC 需要画位图的CDC指针
    UINT IDImage 位图资源ID
    CRect &rect 指定位图在pDC中的位置
    COLORREF rgbMask 位图的透明色
    */
    void DrawTransparentBitmap(CDC *pDC, UINT IDImage,CRect &rect, COLORREF rgbMask)
    {
    CDC ImageDC,MaskDC;

    CBitmap Image,*pOldImage;
    CBitmap maskBitmap,*pOldMaskDCBitmap ;

    Image.LoadBitmap(IDImage);
    ImageDC.CreateCompatibleDC(pDC);
    pOldImage=ImageDC.SelectObject(&Image);

    MaskDC.CreateCompatibleDC(pDC);
    maskBitmap.CreateBitmap( rect.Width(), rect.Height(), 1, 1, NULL );
    pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap );

    ImageDC.SetBkColor(rgbMask);
    MaskDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &ImageDC, 0, 0, SRCCOPY );

    ImageDC.SetBkColor(#000000);
    ImageDC.SetTextColor(#ffffff);
    ImageDC.BitBlt(0, 0, rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);

    pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
    pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &ImageDC, 0, 0,SRCPAINT);

    MaskDC.SelectObject(pOldMaskDCBitmap);
    ImageDC.SelectObject(pOldImage);
    }

    void CDemoDlg::OnPaint()
    {
    CPaintDC dc(this);

    CBitmap BmpBack,*pOldBack,;
    BmpBack.LoadBitmap(IDB_BACKGROUND);

    CDC dcBack;
    dcBack.CreateCompatibleDC(&dc);
    pOldBack=dcBack.SelectObject(&BmpBack);

    dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY);
    DrawTransparentBitmap(&dc,IDB_BITMAPA,CRect(0,0,48,48),#c0c000);

    dcBack.SelectObject(pOldBack);
    }
    http://www.tomore.com/4/3764.html

    画透明位图通常的方法是使用遮罩。所谓遮罩就是一张黑白双色的位图,他和要透明的位图是对应的,遮罩描述了位图中需要透明的部分,透明的部分是黑色的,而不透明的是白色的,白色的部分就是透明的部分。

    假设图A是要画的透明位图,图B是遮罩,图A上是一个大写字母A,字母是红色的,背景是黑色的,图B背景是白色的,上面有一个黑色的字母A和图A的形状是一样的。

    比如我们要在一张蓝天白云的背景上透明地画图A,就是只把红色的字母A画上去。我们可以先将图B和背景进行与操作,再把图B和背景进行或操作就可以了。

    用VC++ MFC实现的代码如下:
    void CDemoDlg::OnPaint()
    {
    CPaintDC dc(this);
    CBitmap BmpBack,BmpA,BmpB,*pOldBack,*pOldA,*pOldB;

    BmpBack.LoadBitmap(IDB_BACKGROUND); // 载入背景图
    BmpA.LoadBitmap(IDB_BITMAPA); //载入图A
    BmpB.LoadBitmap(IDB_BITMAPB); //载入图B

    CDC dcBack,dcA,dcB; //声明三个内存DC用于画图
    dcBack.CreateCompatibleDC(&dc);
    dcA.CreateCompatibleDC(&dc);
    dcB.CreateCompatibleDC(&dc); //把这三个内存DC创建成和PaintDC兼容的DC

    pOldBack=dcBack.SelectObject(&BmpBack);
    pOldA=dcA.SelectObject(&BmpA);
    pOldB=dcB.SelectObject(&BmpB); //把三个位图选入相应的DC

    dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY); //画背景
    dc.BitBlt(0,0,48,48,&dcB,0,0,SRCAND); //用与的方式画遮罩图B
    dc.BitBlt(0,0,48,48,&dcA,0,0,SRCPAINT); //用或的方式画遮图A

    dcBack.SelectObject(pOldBack);
    dcBack.SelectObject(pOldA);
    dcBack.SelectObject(pOldB); //从内存DC中删除位图
    }

    你会看到红色的字母A透明地画在背景上了。

    用遮罩的方法必须事先做好遮罩,遮罩和位图大小一样等于多消耗一倍的资源,比较浪费。还有一种画透明位图的方法,基本原理是一样的,只是不用事先做好遮罩,根据需要动态生成遮罩,但是要求需要透明的位图必须指定一种透明色,凡是这个透明色的地方则画成透明的。

    用VC++ MFC实现的代码如下:
    /*
    这是一个用来画透明位图的函数
    CDC *pDC 需要画位图的CDC指针
    UINT IDImage 位图资源ID
    CRect &rect 指定位图在pDC中的位置
    COLORREF rgbMask 位图的透明色
    */
    void DrawTransparentBitmap(CDC *pDC, UINT IDImage,CRect &rect, COLORREF rgbMask)
    {
    CDC ImageDC,MaskDC;

    CBitmap Image,*pOldImage;
    CBitmap maskBitmap,*pOldMaskDCBitmap ;

    Image.LoadBitmap(IDImage);
    ImageDC.CreateCompatibleDC(pDC);
    pOldImage=ImageDC.SelectObject(&Image);

    MaskDC.CreateCompatibleDC(pDC);
    maskBitmap.CreateBitmap( rect.Width(), rect.Height(), 1, 1, NULL );
    pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap );

    ImageDC.SetBkColor(rgbMask);
    MaskDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &ImageDC, 0, 0, SRCCOPY );

    ImageDC.SetBkColor(#000000);
    ImageDC.SetTextColor(#ffffff);
    ImageDC.BitBlt(0, 0, rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);

    pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
    pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &ImageDC, 0, 0,SRCPAINT);

    MaskDC.SelectObject(pOldMaskDCBitmap);
    ImageDC.SelectObject(pOldImage);
    }

    void CDemoDlg::OnPaint()
    {
    CPaintDC dc(this);

    CBitmap BmpBack,*pOldBack,;
    BmpBack.LoadBitmap(IDB_BACKGROUND);

    CDC dcBack;
    dcBack.CreateCompatibleDC(&dc);
    pOldBack=dcBack.SelectObject(&BmpBack);

    dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY);
    DrawTransparentBitmap(&dc,IDB_BITMAPA,CRect(0,0,48,48),#c0c000);

    dcBack.SelectObject(pOldBack);
    }
    http://www.tomore.com/4/3764.html

    画透明位图通常的方法是使用遮罩。所谓遮罩就是一张黑白双色的位图,他和要透明的位图是对应的,遮罩描述了位图中需要透明的部分,透明的部分是黑色的,而不透明的是白色的,白色的部分就是透明的部分。

    假设图A是要画的透明位图,图B是遮罩,图A上是一个大写字母A,字母是红色的,背景是黑色的,图B背景是白色的,上面有一个黑色的字母A和图A的形状是一样的。

    比如我们要在一张蓝天白云的背景上透明地画图A,就是只把红色的字母A画上去。我们可以先将图B和背景进行与操作,再把图B和背景进行或操作就可以了。

    用VC++ MFC实现的代码如下:
    void CDemoDlg::OnPaint()
    {
    CPaintDC dc(this);
    CBitmap BmpBack,BmpA,BmpB,*pOldBack,*pOldA,*pOldB;

    BmpBack.LoadBitmap(IDB_BACKGROUND); // 载入背景图
    BmpA.LoadBitmap(IDB_BITMAPA); //载入图A
    BmpB.LoadBitmap(IDB_BITMAPB); //载入图B

    CDC dcBack,dcA,dcB; //声明三个内存DC用于画图
    dcBack.CreateCompatibleDC(&dc);
    dcA.CreateCompatibleDC(&dc);
    dcB.CreateCompatibleDC(&dc); //把这三个内存DC创建成和PaintDC兼容的DC

    pOldBack=dcBack.SelectObject(&BmpBack);
    pOldA=dcA.SelectObject(&BmpA);
    pOldB=dcB.SelectObject(&BmpB); //把三个位图选入相应的DC

    dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY); //画背景
    dc.BitBlt(0,0,48,48,&dcB,0,0,SRCAND); //用与的方式画遮罩图B
    dc.BitBlt(0,0,48,48,&dcA,0,0,SRCPAINT); //用或的方式画遮图A

    dcBack.SelectObject(pOldBack);
    dcBack.SelectObject(pOldA);
    dcBack.SelectObject(pOldB); //从内存DC中删除位图
    }

    你会看到红色的字母A透明地画在背景上了。

    用遮罩的方法必须事先做好遮罩,遮罩和位图大小一样等于多消耗一倍的资源,比较浪费。还有一种画透明位图的方法,基本原理是一样的,只是不用事先做好遮罩,根据需要动态生成遮罩,但是要求需要透明的位图必须指定一种透明色,凡是这个透明色的地方则画成透明的。

    用VC++ MFC实现的代码如下:
    /*
    这是一个用来画透明位图的函数
    CDC *pDC 需要画位图的CDC指针
    UINT IDImage 位图资源ID
    CRect &rect 指定位图在pDC中的位置
    COLORREF rgbMask 位图的透明色
    */
    void DrawTransparentBitmap(CDC *pDC, UINT IDImage,CRect &rect, COLORREF rgbMask)
    {
    CDC ImageDC,MaskDC;

    CBitmap Image,*pOldImage;
    CBitmap maskBitmap,*pOldMaskDCBitmap ;

    Image.LoadBitmap(IDImage);
    ImageDC.CreateCompatibleDC(pDC);
    pOldImage=ImageDC.SelectObject(&Image);

    MaskDC.CreateCompatibleDC(pDC);
    maskBitmap.CreateBitmap( rect.Width(), rect.Height(), 1, 1, NULL );
    pOldMaskDCBitmap = MaskDC.SelectObject( &maskBitmap );

    ImageDC.SetBkColor(rgbMask);
    MaskDC.BitBlt( 0, 0, rect.Width(), rect.Height(), &ImageDC, 0, 0, SRCCOPY );

    ImageDC.SetBkColor(#000000);
    ImageDC.SetTextColor(#ffffff);
    ImageDC.BitBlt(0, 0, rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);

    pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &MaskDC, 0, 0, SRCAND);
    pDC->BitBlt(rect.left,rect.top,rect.Width(), rect.Height(), &ImageDC, 0, 0,SRCPAINT);

    MaskDC.SelectObject(pOldMaskDCBitmap);
    ImageDC.SelectObject(pOldImage);
    }

    void CDemoDlg::OnPaint()
    {
    CPaintDC dc(this);

    CBitmap BmpBack,*pOldBack,;
    BmpBack.LoadBitmap(IDB_BACKGROUND);

    CDC dcBack;
    dcBack.CreateCompatibleDC(&dc);
    pOldBack=dcBack.SelectObject(&BmpBack);

    dc.BitBlt(0,0,100,100,&dcBack,0,0,SRCCOPY);
    DrawTransparentBitmap(&dc,IDB_BITMAPA,CRect(0,0,48,48),#c0c000);

    dcBack.SelectObject(pOldBack);
    }
  • 相关阅读:
    IOS -- 获取本地图片和网络图片的大小size
    xib中的label加边框
    iOS开发之Masonry框架源码深度解析
    10分钟搭建 App 主流框架
    卸载服务器GitLab
    linux安装git方法
    虚拟机安装centos7, 再安装gitlab 简单步骤
    collectionView 防止cell复用的方法
    UIButton 设置图片文字垂直居中排列
    button获取验证码60秒倒计时 直接用
  • 原文地址:https://www.cnblogs.com/yuanbao/p/1251921.html
Copyright © 2011-2022 走看看