欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c#中WinForm使用OpencvSharp4實(shí)現(xiàn)簡(jiǎn)易抓邊

 更新時(shí)間:2022年05月06日 10:16:13   作者:Iawfy_  
本文主要介紹了c#中WinForm使用OpencvSharp4實(shí)現(xiàn)簡(jiǎn)易抓邊,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

環(huán)境: VS2019 , OpencvSharp4 4.5.5.20211231 , .NET Framework 4.8

界面設(shè)計(jì):

圖像顯示用的是picturebox 控件都是windows基本控件

效果展示:

圖像是自己畫(huà)圖畫(huà)的 所以抓的效果比較好 。其他圖片的話(huà)可能需要調(diào)整一下相關(guān)參數(shù),效果可能達(dá)不到這么好

實(shí)現(xiàn)原理: 在圖像中選擇ROI,從原圖上把對(duì)應(yīng)ROI部分的圖像扣下來(lái),然后對(duì)扣下來(lái)的圖像進(jìn)行邊緣處理等操作,得到邊緣和擬合線(xiàn),最后在原圖上將邊緣和擬合線(xiàn)畫(huà)出來(lái)即可。注意,得到的邊緣是相對(duì)于ROI區(qū)域的坐標(biāo),需要轉(zhuǎn)化成相對(duì)于原圖的坐標(biāo)才行,只需加上ROI的坐標(biāo)即可。

主要部分代碼:

定義的ROI類(lèi) 注意一下四個(gè)點(diǎn)的相對(duì)位置

    public class ROI
    { 
        // 四個(gè)點(diǎn)的順序關(guān)系
        //  1---2
        //  |   |
        //  3---4
        public OpenCvSharp.Point FirstPoint { get; set; } = new OpenCvSharp.Point(0, 0);
        public OpenCvSharp.Point SecondPoint { get; set; } = new OpenCvSharp.Point(0, 0);
        public OpenCvSharp.Point ThirdPoint { get; set; } = new OpenCvSharp.Point(0, 0);
        public OpenCvSharp.Point FourthPoint { get; set; } = new OpenCvSharp.Point(0, 0);
 
        public OpenCvSharp.Point2f Center
        {
            get
            {
                OpenCvSharp.Point2f center = new OpenCvSharp.Point2f();
                center.X = (float)((FirstPoint.X + SecondPoint.X + ThirdPoint.X + FourthPoint.X) / 4.0);
                center.Y = (float)((FirstPoint.Y + SecondPoint.Y + ThirdPoint.Y + FourthPoint.Y) / 4.0);
                return center;
            }
        }
 
        public OpenCvSharp.Size2f Size
        {
            get
            {
                return new OpenCvSharp.Size2f(Width, Height);
            }
        }
        public int XLeft
        {
            get { return FirstPoint.X; }
        }
        public int YTop
        {
            get { return FirstPoint.Y; }
        }
        public int XRight
        {
            get { return FourthPoint.X; }
        }
        public int YBottom
        {
            get { return FourthPoint.Y; }
        }
 
        public double Width
        {
            get { return FourthPoint.X - FirstPoint.X; } 
        }
        public double Height
        {
            get { return FourthPoint.Y - FirstPoint.Y; } 
        }
 
        public void Reset()
        {
            FirstPoint = new OpenCvSharp.Point(0, 0);
            SecondPoint = new OpenCvSharp.Point(0, 0);
            ThirdPoint = new OpenCvSharp.Point(0, 0);
            FourthPoint = new OpenCvSharp.Point(0, 0);
        }
 
        // 四個(gè)點(diǎn)全為0 則判斷為空
        public bool IsNull()
        {
            bool en = true;
            en = en && FirstPoint == new OpenCvSharp.Point(0, 0);
            en = en && SecondPoint == new OpenCvSharp.Point(0, 0);
            en = en && ThirdPoint == new OpenCvSharp.Point(0, 0);
            en = en && FourthPoint == new OpenCvSharp.Point(0, 0);
            return en;
        }
 
        public OpenCvSharp.Point2f[] GetCoutonrs2f()
        {
            OpenCvSharp.Point2f[] coutonrs = new OpenCvSharp.Point2f[4];
            coutonrs[0] = FirstPoint;
            coutonrs[1] = SecondPoint;
            coutonrs[2] = FourthPoint;
            coutonrs[3] = ThirdPoint;
            return coutonrs;
        }
 
        public OpenCvSharp.Point[] GetCoutonrs()
        {
            OpenCvSharp.Point[] coutonrs = new OpenCvSharp.Point[4];
            coutonrs[0] = FirstPoint;
            coutonrs[1] = SecondPoint;
            coutonrs[2] = FourthPoint;
            coutonrs[3] = ThirdPoint;
            return coutonrs;
        } 
    }

相關(guān)變量:

    public enum eDirections  // ROI移動(dòng)方向
    {
        NULL = 0,
        上 = 1,
        下 = 2,
        左 = 3,
        右 = 4
    }
 
    //ROI大小調(diào)整方式
    public enum eResizeMode
    {
        All = 0, // 長(zhǎng)寬一起調(diào)整
        Width = 1, // 只變寬度 即 矩形的長(zhǎng)
        Height = 2, //  只變高度 即 矩形的寬
    }
 
 
    public class yVars
    {
        public static string OriImg; // 原圖
 
        public static bool IsDrawEdgeOK = false; 
        public static bool pbxMouseDown = false;
        public static bool IsMouseMove = false;
        public static bool IsSelectROIOK = false;
        public static bool IsMouseUp = false;
 
        public static int step; //ROI區(qū)域移動(dòng)步長(zhǎng)
        public static eDirections direct = eDirections.NULL;
 
        public static int ROINum = 1; // 操作第一個(gè)ROI還是第二個(gè)ROI
        public static bool IsSelectingROI = false;
        //  
        public static bool IsSelectROI_1 = false;
        public static bool IsSelectROI_1_OK = false;
 
        public static bool IsSelectROI_2 = false;
        public static bool IsSelectROI_2_OK = false;
 
        public static ROI myROI_1 = new ROI();
        public static ROI myROI_2 = new ROI();
    }

ROI的繪制:

 矩形的ROI ,我們只需要兩個(gè)點(diǎn)就能確定一個(gè)矩形。

我們獲取到的位置是鼠標(biāo)相對(duì)于picturebox的位置,需要轉(zhuǎn)化成相對(duì)于圖像的坐標(biāo),我的 picturebox 的 sizemode 是 stretchImage ,所以按比例轉(zhuǎn)化過(guò)去就行。

 在 picturebox 的 mousedown 事件中 記錄鼠標(biāo)按下的第一個(gè)位置 為ROI的第一個(gè)點(diǎn)。

我把繪制ROI的過(guò)程寫(xiě)在 mousemove 事件里面,這樣就能實(shí)現(xiàn)在確定第一個(gè)點(diǎn)后鼠標(biāo)移動(dòng)時(shí)ROI區(qū)域一直顯示出來(lái)

        private void pbxImgShow_MouseMove(object sender, MouseEventArgs e)
        {
            if (yVars.IsSelectROI_1 == false && yVars.IsSelectROI_2 == false)
                return;
            if (yVars.pbxMouseDown == false)
                return;
            if (yVars.IsMouseUp == true)
                return;
            int mx = 0, my = 0;
            Mat mm = new Mat(yVars.OriImg);
            // 鼠標(biāo)相對(duì)于picturebox的位置
            mx = Frm_Main.Instance.pbxImgShow.PointToClient(Control.MousePosition).X;
            my = Frm_Main.Instance.pbxImgShow.PointToClient(Control.MousePosition).Y;
 
            // 鼠標(biāo)移動(dòng)時(shí) 位置在 picturebox 中就畫(huà)出對(duì)應(yīng)的ROI形狀
            if (mx < pbxImgShow.Width && my < pbxImgShow.Height)
            {
                //轉(zhuǎn)成在圖片上的位置
                double xx = mx * mm.Width * 1.0 / Frm_Main.Instance.pbxImgShow.Width;
                double yy = my * mm.Height * 1.0 / Frm_Main.Instance.pbxImgShow.Height;
 
                if (yVars.IsSelectROI_1 == true)
                {
                    yVars.myROI_1.FourthPoint = new OpenCvSharp.Point(xx, yy);
                    yVars.myROI_1.SecondPoint = new OpenCvSharp.Point(xx, yVars.myROI_1.FirstPoint.Y);
                    yVars.myROI_1.ThirdPoint = new OpenCvSharp.Point(yVars.myROI_1.FirstPoint.X, yy);
 
                    mm = yActions.DrawROIMat(mm, yVars.myROI_1);
                    yVars.IsSelectROI_1_OK = true;
                }
                else if (yVars.IsSelectROI_2 == true)
                {
                    yVars.myROI_2.FourthPoint = new OpenCvSharp.Point(xx, yy);
                    yVars.myROI_2.SecondPoint = new OpenCvSharp.Point(xx, yVars.myROI_2.FirstPoint.Y);
                    yVars.myROI_2.ThirdPoint = new OpenCvSharp.Point(yVars.myROI_2.FirstPoint.X, yy);
                    mm = yActions.DrawROIMat(mm, yVars.myROI_2);
                    yVars.IsSelectROI_2_OK = true;
                }
                yVars.IsMouseMove = true;
            }
            else // 釋放鼠標(biāo)時(shí)的點(diǎn)位不在picturebox中 將相關(guān)變量值清空 
            {
                if (yVars.IsSelectROI_1 == true)
                {
                    yVars.myROI_1.Reset();
 
                    yVars.IsSelectROI_1_OK = false;
                }
                else if (yVars.IsSelectROI_2 == true)
                {
                    yVars.myROI_2.Reset();
                    yVars.IsSelectROI_2_OK = false;
                }
            }
            pbxImgShow.Image = yImgConvert.MatToBitmap(mm);
            mm.Release();
        }

在線(xiàn)程或者循環(huán)等過(guò)程中定義的 mat 要及時(shí) Release 掉。

在 mouseup 事件中就繪制完成了 注意選擇的第一點(diǎn)和第二點(diǎn),分別是ROI的 FirstPoint 和 FourthPoint  ,兩點(diǎn)的相對(duì)位置要確定好,要保證 FirstPoint 為左上角的點(diǎn) FourthPoint 為右下角的點(diǎn),不是的話(huà) 就對(duì) FirstPoint 和 FourthPoint 重新賦值, FirstPoint 為兩點(diǎn)的 x , y 最小的點(diǎn) ,F(xiàn)ourthPoint  為兩點(diǎn)的 x , y 最大的點(diǎn)。

繪制完ROI后可以對(duì)其位置和大小進(jìn)行相應(yīng)的調(diào)整。

        public static Mat DrawROIMat(Mat src, ROI rOI, Scalar? scalar = null, int thickness = 1, LineTypes lineTypes = LineTypes.AntiAlias)
        {
            Scalar sc = scalar ?? Scalar.Red;
            Cv2.Line(src, rOI.FirstPoint, rOI.SecondPoint, sc, thickness, lineTypes);
            Cv2.Line(src, rOI.SecondPoint, rOI.FourthPoint, sc, thickness, lineTypes);
            Cv2.Line(src, rOI.FourthPoint, rOI.ThirdPoint, sc, thickness, lineTypes);
            Cv2.Line(src, rOI.ThirdPoint, rOI.FirstPoint, sc, thickness, lineTypes);
            return src;
        }

對(duì)位置進(jìn)行調(diào)整: 主要思想就是對(duì)ROI的四個(gè)點(diǎn)的坐標(biāo)相應(yīng)方向進(jìn)行加減即可,主要超限問(wèn)題即可。

        public static void ImgROIMove(Mat src, out Mat dstImg, ref ROI rOI, eDirections eDirections, double step, int gap = 3)
        {
            dstImg = new Mat();
 
            switch (eDirections)
            {
                case eDirections.NULL:
                    break;
                case eDirections.上:
                    if (rOI.YTop - step <= gap)
                    {
                        rOI.ThirdPoint = new OpenCvSharp.Point(rOI.ThirdPoint.X, rOI.ThirdPoint.Y - rOI.YTop + gap);
                        rOI.FourthPoint = new OpenCvSharp.Point(rOI.FourthPoint.X, rOI.FourthPoint.Y - rOI.YTop + gap);
                        rOI.FirstPoint = new OpenCvSharp.Point(rOI.FirstPoint.X, gap);
                        rOI.SecondPoint = new OpenCvSharp.Point(rOI.SecondPoint.X, gap);
                    }
                    else
                    {
                        rOI.FirstPoint = new OpenCvSharp.Point(rOI.FirstPoint.X, rOI.FirstPoint.Y - step);
                        rOI.SecondPoint = new OpenCvSharp.Point(rOI.SecondPoint.X, rOI.SecondPoint.Y - step);
                        rOI.ThirdPoint = new OpenCvSharp.Point(rOI.ThirdPoint.X, rOI.ThirdPoint.Y - step);
                        rOI.FourthPoint = new OpenCvSharp.Point(rOI.FourthPoint.X, rOI.FourthPoint.Y - step);
                    }
                    break;
                case eDirections.下:
                    if (rOI.YBottom + step >= src.Height - gap)
                    {
                        rOI.FirstPoint = new OpenCvSharp.Point(rOI.FirstPoint.X, rOI.FirstPoint.Y + src.Height - rOI.YBottom - gap);
                        rOI.SecondPoint = new OpenCvSharp.Point(rOI.SecondPoint.X, rOI.SecondPoint.Y + src.Height - rOI.YBottom - gap);
                        rOI.ThirdPoint = new OpenCvSharp.Point(rOI.ThirdPoint.X, src.Height - gap);
                        rOI.FourthPoint = new OpenCvSharp.Point(rOI.FourthPoint.X, src.Height - gap);
                    }
                    else
                    {
                        rOI.FirstPoint = new OpenCvSharp.Point(rOI.FirstPoint.X, rOI.FirstPoint.Y + step);
                        rOI.SecondPoint = new OpenCvSharp.Point(rOI.SecondPoint.X, rOI.SecondPoint.Y + step);
                        rOI.ThirdPoint = new OpenCvSharp.Point(rOI.ThirdPoint.X, rOI.ThirdPoint.Y + step);
                        rOI.FourthPoint = new OpenCvSharp.Point(rOI.FourthPoint.X, rOI.FourthPoint.Y + step);
                    }
                    break;
                case eDirections.左:
                    if (rOI.XLeft - step <= gap)
                    {
                        rOI.SecondPoint = new OpenCvSharp.Point(rOI.SecondPoint.X - rOI.XLeft + gap, rOI.SecondPoint.Y);
                        rOI.FourthPoint = new OpenCvSharp.Point(rOI.FourthPoint.X - rOI.XLeft + gap, rOI.FourthPoint.Y);
                        rOI.ThirdPoint = new OpenCvSharp.Point(gap, rOI.ThirdPoint.Y);
                        rOI.FirstPoint = new OpenCvSharp.Point(gap, rOI.FirstPoint.Y);
                    }
                    else
                    {
                        rOI.FirstPoint = new OpenCvSharp.Point(rOI.FirstPoint.X - step, rOI.FirstPoint.Y);
                        rOI.SecondPoint = new OpenCvSharp.Point(rOI.SecondPoint.X - step, rOI.SecondPoint.Y);
                        rOI.ThirdPoint = new OpenCvSharp.Point(rOI.ThirdPoint.X - step, rOI.ThirdPoint.Y);
                        rOI.FourthPoint = new OpenCvSharp.Point(rOI.FourthPoint.X - step, rOI.FourthPoint.Y);
                    }
                    break;
                case eDirections.右:
                    if (rOI.XRight + step >= src.Width - gap)
                    {
                        rOI.FirstPoint = new OpenCvSharp.Point(rOI.FirstPoint.X + src.Width - rOI.XRight - gap, rOI.FirstPoint.Y);
                        rOI.ThirdPoint = new OpenCvSharp.Point(rOI.ThirdPoint.X + src.Width - rOI.XRight - gap, rOI.ThirdPoint.Y);
                        rOI.FourthPoint = new OpenCvSharp.Point(src.Width - gap, rOI.FourthPoint.Y);
                        rOI.SecondPoint = new OpenCvSharp.Point(src.Width - gap, rOI.SecondPoint.Y);
                    }
                    else
                    {
                        rOI.FirstPoint = new OpenCvSharp.Point(rOI.FirstPoint.X + step, rOI.FirstPoint.Y);
                        rOI.SecondPoint = new OpenCvSharp.Point(rOI.SecondPoint.X + step, rOI.SecondPoint.Y);
                        rOI.ThirdPoint = new OpenCvSharp.Point(rOI.ThirdPoint.X + step, rOI.ThirdPoint.Y);
                        rOI.FourthPoint = new OpenCvSharp.Point(rOI.FourthPoint.X + step, rOI.FourthPoint.Y);
                    }
                    break;
                default:
                    break;
            }
            dstImg = yActions.DrawROIMat(src, rOI);
        }

對(duì)大小進(jìn)行調(diào)整: 主要思路是 ROI 大小調(diào)整前后,其中心點(diǎn)坐標(biāo)不變,相應(yīng)的長(zhǎng)度和寬度變了。我們就可以采用 OpenCvSharp.RotatedRect 這個(gè)類(lèi),根據(jù) 中心點(diǎn)坐標(biāo),相應(yīng)size,和傾斜角度(正矩形為0). 最后再把 RotatedRect 的四個(gè)頂點(diǎn)重新賦值給 ROI的四個(gè)頂點(diǎn)就好,注意一下點(diǎn)的相對(duì)位置關(guān)系。

        public static void ImgROIResize(Mat src, out Mat dstImg, ref ROI rOI, bool IsAdd, double step, eResizeMode eResizeMode)
        {
            dstImg = new Mat();
            double height = rOI.Height, width = rOI.Width; 
            if (IsAdd == true)
            {
                switch (eResizeMode)
                {
                    case eResizeMode.All:
                        height = rOI.Height + step;
                        width = rOI.Width + step;
                        break;
                    case eResizeMode.Width:
                        width = rOI.Width + step;
                        break;
                    case eResizeMode.Height:
                        height = rOI.Height + step;
                        break;
                }
            }
            else
            {
                switch (eResizeMode)
                {
                    case eResizeMode.All:
                        height = rOI.Height - step;
                        width = rOI.Width - step;
                        break;
                    case eResizeMode.Width:
                        width = rOI.Width - step;
                        break;
                    case eResizeMode.Height:
                        height = rOI.Height - step;
                        break;
                }
            }
 
            OpenCvSharp.Size2f size = new Size2f(width, height);
            OpenCvSharp.RotatedRect rotateRect = new RotatedRect(rOI.Center, size, 0);
            Point2f[] points = rotateRect.Points();// 獲得矩形四個(gè)頂點(diǎn)坐標(biāo)
            // 大小縮放后需要判斷坐標(biāo)是否超限 
            for (int i = 0; i < points.Length; i++)
            {  
                if (points[i].X <= 0 || points[i].Y <= 0 || points[i].X >= src.Width || points[i].Y >= src.Height)
                {
                    return;
                }
            }
            rOI.FirstPoint = new OpenCvSharp.Point(points[1].X, points[1].Y);
            rOI.SecondPoint = new OpenCvSharp.Point(points[2].X, points[2].Y);
            rOI.ThirdPoint = new OpenCvSharp.Point(points[0].X, points[0].Y);
            rOI.FourthPoint = new OpenCvSharp.Point(points[3].X, points[3].Y);
            dstImg = yActions.DrawROIMat(src, rOI); 
        }

繪制并調(diào)整好ROI后,從原圖上將對(duì)應(yīng)的ROI圖像扣下來(lái),

        public static Mat GetROIMat(Mat mm, ROI rOI)
        {
            Mat mask = Mat.Zeros(mm.Size(), MatType.CV_8UC1);
            List<List<OpenCvSharp.Point>> pp = new List<List<OpenCvSharp.Point>>() {
               rOI.GetCoutonrs().ToList()
            }; 
            Cv2.FillPoly(mask, pp, new Scalar(255, 255, 255));
            OpenCvSharp.Rect rect = Cv2.BoundingRect(rOI.GetCoutonrs2f());
            if (rect.X <= 0) rect.X = 1;
            if (rect.Y <= 0) rect.Y = 0;
            if (rect.X + rect.Width > mm.Width)
                rect.Width = mm.Width - rect.X - 1;
            if (rect.Y + rect.Height > mm.Height)
                rect.Height = mm.Height - rect.Y - 1;
            Mat src = new Mat(mm, rect);
            Mat maskROI = new Mat(mask, rect);
            Mat dstImg = new Mat();
            Cv2.BitwiseAnd(src, src, dstImg, maskROI);
            return dstImg;
        }

然后對(duì)每張扣下來(lái)的mat進(jìn)行邊緣檢測(cè) 抓邊擬合等操作

部分代碼

            coutonrs = yVars.myROI_1.GetCoutonrs2f();
            srcROIImg = yActions.GetROIMat(src, yVars.myROI_1);
            Cv2.CvtColor(srcROIImg, grayImg, ColorConversionCodes.RGB2GRAY);
            Cv2.Blur(grayImg, grayImg, new OpenCvSharp.Size(3, 3));
            Cv2.Canny(grayImg, cannyImg, param1, param2, param3, true);
            //獲得輪廓 
            Cv2.FindContours(cannyImg, out contoursROI1, out hierarchly, RetrievalModes.Tree, ContourApproximationModes.ApproxSimple, new OpenCvSharp.Point(0, 0));
 
            if (contoursROI1.Length == 0)
            {
                YXH._01.yMessagebox.ShowDialogCN("ROI_1未抓到邊,請(qǐng)調(diào)整遲滯參數(shù),或重新選擇ROI區(qū)域");
                return;
            }
            // 獲取輪廓后需要將點(diǎn)的坐標(biāo)轉(zhuǎn)換到原圖上 此時(shí)的坐標(biāo)是相對(duì)于ROI區(qū)域的坐標(biāo) 
            // 即每個(gè)坐標(biāo)需要加上ROI區(qū)域的左上角坐標(biāo) 再將轉(zhuǎn)化后的坐標(biāo)添加進(jìn)擬合集合內(nèi)
            for (int i = 0; i < contoursROI1.Length; i++)
            {
                for (int j = 0; j < contoursROI1[i].Length; j++)
                {
                    contoursROI1[i][j] += yVars.myROI_1.FirstPoint;
                    ROI_1_Points.Add(contoursROI1[i][j]);
                    AllPoints.Add(contoursROI1[i][j]);
                }
            }

操作完成后再根據(jù)想要在界面上顯示的進(jìn)行相應(yīng)的繪制即可。

到此這篇關(guān)于c#中WinForm使用OpencvSharp4實(shí)現(xiàn)簡(jiǎn)易抓邊的文章就介紹到這了,更多相關(guān)c# OpencvSharp4 抓邊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C#連接MySql數(shù)據(jù)庫(kù)的方法

    C#連接MySql數(shù)據(jù)庫(kù)的方法

    最近兩天在解決C#連接MySql數(shù)據(jù)庫(kù)的問(wèn)題,通過(guò)不同的從網(wǎng)上學(xué)習(xí),最終找到了解決的辦法,現(xiàn)在和大家分享一下
    2013-10-10
  • c#解壓文件的實(shí)例方法

    c#解壓文件的實(shí)例方法

    該方法適應(yīng)應(yīng)用桌面快捷鍵壓縮的文件,zip,rar格式的文件進(jìn)行解壓!
    2013-05-05
  • 利用C#實(shí)現(xiàn)可以繼承的"枚舉"

    利用C#實(shí)現(xiàn)可以繼承的"枚舉"

    工作中許多代碼中用到枚舉(enum),更用到了需要繼承的枚舉,由于C#的枚舉不允許被繼承,所以本文就來(lái)模擬實(shí)現(xiàn)一個(gè)可以繼承的仿枚舉吧
    2023-05-05
  • C#創(chuàng)建一個(gè)Word并打開(kāi)的方法

    C#創(chuàng)建一個(gè)Word并打開(kāi)的方法

    這篇文章主要介紹了C#創(chuàng)建一個(gè)Word并打開(kāi)的方法,實(shí)例分析了C#操作word的常用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • C#如何實(shí)現(xiàn)用戶(hù)名與密碼登錄

    C#如何實(shí)現(xiàn)用戶(hù)名與密碼登錄

    這篇文章主要介紹了C#如何實(shí)現(xiàn)用戶(hù)名與密碼登錄問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 在C#中對(duì)TCP客戶(hù)端的狀態(tài)封裝詳解

    在C#中對(duì)TCP客戶(hù)端的狀態(tài)封裝詳解

    本篇文章小編為大家介紹,在C#中對(duì)TCP客戶(hù)端的狀態(tài)封裝詳解,需要的朋友參考下
    2013-04-04
  • 深入解析C#中的泛型類(lèi)與泛型接口

    深入解析C#中的泛型類(lèi)與泛型接口

    這篇文章主要介紹了C#中的泛型類(lèi)與泛型接口,對(duì)泛型的支持是C#語(yǔ)言的重要特性,需要的朋友可以參考下
    2016-02-02
  • c#設(shè)計(jì)模式 適配器模式詳細(xì)介紹

    c#設(shè)計(jì)模式 適配器模式詳細(xì)介紹

    結(jié)構(gòu)模式(Structural Pattern)描述如何將類(lèi)或者對(duì)象結(jié)合在一起形成更大的結(jié)構(gòu)。結(jié)構(gòu)模式描述兩種不同的東西:類(lèi)與類(lèi)的實(shí)例。根據(jù)這一點(diǎn),結(jié)構(gòu)模式可以分為類(lèi)的結(jié)構(gòu)模式和對(duì)象的結(jié)構(gòu)模式
    2012-10-10
  • C# SortedList排序列表的實(shí)現(xiàn)

    C# SortedList排序列表的實(shí)現(xiàn)

    本文主要介紹了C# SortedList排序列表的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • C#中txt數(shù)據(jù)寫(xiě)入的幾種常見(jiàn)方法

    C#中txt數(shù)據(jù)寫(xiě)入的幾種常見(jiàn)方法

    這篇文章主要給大家介紹了關(guān)于C#中txt數(shù)據(jù)寫(xiě)入的幾種常見(jiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評(píng)論