溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C#中怎么實現(xiàn)不規(guī)則裁切圖片

發(fā)布時間:2021-07-07 15:42:22 來源:億速云 閱讀:379 作者:Leah 欄目:大數(shù)據(jù)

本篇文章為大家展示了C#中怎么實現(xiàn)不規(guī)則裁切圖片,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

C#使用GDI+可以創(chuàng)建,修改圖片,創(chuàng)建圖片的bitmap,使用Graphics在圖片上勾畫元素,點、線、面等。

規(guī)則的圖片裁切,設(shè)置圖片的方形或者圓形的方式,就能直接進(jìn)行圖片的裁切。裁切使用jpg保存,圖片的被裁切部分,會以白色的背景顯示,使用png才能設(shè)置圖片的透明度。

下邊介紹一種不規(guī)則的圖片裁切方式,當(dāng)然不規(guī)則圖片都能裁切了,使用此種方式,也能進(jìn)行規(guī)則圖片的裁切,作用的圖片格式為png,設(shè)置png圖片的像素點透明度。

C#的開發(fā)中,可以獲取和設(shè)置圖片上的每個像素的顏色值,在圖片的尺寸不太大的情況下,循環(huán)獲取每個像素的顏色,設(shè)置每個像素點的透明度,從而達(dá)到裁切圖片。

在圖片比較大的情況下,建議使用unsafe的方式,遍歷圖片的像素點,此方法在網(wǎng)上可以搜到,遍歷速度是按照普通方式遍歷的幾倍甚至幾十倍。

裁切開始,使用GraphicsPath新建裁切的不規(guī)則圖形,一般使用polygon,此對象中,需要把polygon的每個點都添加到GraphicsPath中,GraphicsPath中有IsVisible方法,根據(jù)遍歷循環(huán)的點,判斷點是否在

GraphicsPath中,設(shè)置當(dāng)前點的是否可見即可。

PointF _pint1 = new PointF(1.0f, 1.0f);

PointF _pint2 = new PointF(600.0f, 200.0f);

PointF _pint3 = new PointF(200.0f, 500.0f);

PointF[] _pointArr = new PointF[] { _pint1, _pint2,  _pint4, _pint3 };

 GraphicsPath _gpath = new GraphicsPath();

 _gpath.AddPolygon(_pointArr);

在循環(huán)中,發(fā)現(xiàn)GraphicsPath的IsVisible方法,速度比較慢,這就聯(lián)系到GIS中一個簡單算法,判斷點是否在面里,其實按照地圖平面的算法方式,圖片的中像素點也是判斷是否在圖片的面中,所以,改進(jìn)一下,寫一個C#的方式,參照互聯(lián)網(wǎng)上,如下代碼:

public bool IsVisible(System.Drawing.PointF p,

 List<System.Drawing.PointF> points)

        {

            int i, j = points.Count - 1;

            bool isVisible = false;

            for (i = 0; i < points.Count; i++)

            {

                if (points[i].Y < p.Y && points[j].Y >= p.Y

                    || points[j].Y < p.Y && points[i].Y >= p.Y)

                {

                    if (points[i].X + (p.Y - points[i].Y) / (points[j].Y - points[i].Y)

                        * (points[j].X - points[i].X) < p.X)

                    {

                        isVisible = !isVisible;

                    }

                }

                j = i;

            }

            return isVisible;

        }

上述內(nèi)容就是C#中怎么實現(xiàn)不規(guī)則裁切圖片,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI