最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#自定義畫刷原理解析

 更新時間:2022年08月19日 11:18:49   作者:林子xxx  
這篇文章主要為大家詳細(xì)介紹了C#自定義畫刷原理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

windows系統(tǒng)中的畫板工具,有好幾種畫刷,C#中并沒有直接對應(yīng)可使用的類,只能自己研究。

1.畫刷原理

根據(jù)本人對PS的相關(guān)功能細(xì)心分析,發(fā)現(xiàn)各種畫刷其實就是一幅圖片的移位重疊顯示。通常這幅畫刷圖是半透明的,只有其中一些區(qū)域有顏色。

上圖中的畫刷,把間隔設(shè)大之后可以明顯看到原圖的模樣。

這是基于位移的畫刷,另外有基于時間的,比如噴槍工具。

2.代碼實現(xiàn)

1).  直線算法

為什么要直線算法?因為我們移動鼠標(biāo),觸發(fā)MouseMove事件,記錄鼠標(biāo)前一坐標(biāo)點與當(dāng)前點,如果兩點是是相鄰的,當(dāng)然不需要再做多余的算法,當(dāng)如果兩點是不相鄰的,我們就需要計算兩點之間所有的點。否則無法有效地進行固定間隔繪制畫刷圖。

/// <summary>
/// 順序獲取兩點間直線上的所有點
/// </summary>
/// <param name="pStart">開始點</param>
/// <param name="pEnd">結(jié)束點</param>
/// <returns>兩點間直線上的所有點</returns>
private List<Point> getPoint2Point(Point pStart, Point pEnd)
? ? ? ? {
? ? ? ? ? ? List<Point> linePoint = new List<Point>();
? ? ? ? ? ? if (pStart.X == pEnd.X && pStart.Y == pEnd.Y)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? linePoint.Add(pStart);
? ? ? ? ? ? ? ? return linePoint;
? ? ? ? ? ? }
? ? ? ? ? ? DDALine(pStart.X, pStart.Y, pEnd.X, pEnd.Y, ref ?linePoint);
? ? ? ? ? ? return linePoint;
? ? ? ? }
? ? ? ? //DDA直線畫法
? ? ? ? private void DDALine(int x0, int y0, int x1, int y1, ref List<Point> ptl)?
? ? ? ? { ?
? ? ? ? ? ? int dx,dy,eps1,k; ?
? ? ? ? ? ? float x,y,xIncre,yIncre; ?
? ? ? ? ? ? dx=x1-x0; ?
? ? ? ? ? ? dy=y1-y0; ?
? ? ? ? ? ? x=x0; ?
? ? ? ? ? ? y=y0; ?
? ? ? ? ? ? if(Math.Abs(dx)>Math.Abs(dy)) ?
? ? ? ? ? ? eps1=Math.Abs(dx); ?
? ? ? ? ? ? else ?
? ? ? ? ? ? eps1=Math.Abs(dy); ?
? ? ? ? ? ? xIncre=(float)dx/(float)eps1; ?
? ? ? ? ? ? yIncre=(float)dy/(float)eps1; ?
? ? ? ? ? ? for(k=0;k<=eps1;k++) ?
? ? ? ? ? ? {
? ? ? ? ? ? ? ? ptl.Add( new Point((int)(x + 0.5), (int)(y + 0.5)) ); ?
? ? ? ? ? ? ? ? x+=xIncre; ?
? ? ? ? ? ? ? ? y+=yIncre; ?
? ? ? ? ? ? } ?
? ? ? ? }?

2).鼠標(biāo)事件

分別為鼠標(biāo)按下、移動、放開事件

bool bIsDraw = false; //主圖畫線
Point startPoint_Draw = new Point();//劃線點變量
List<Point> pts = new List<Point>();//畫點保存
private void pictureBox_main_MouseMove(object sender, MouseEventArgs e)
?{
? ? ? ? ? ? PictureBox pb = sender as PictureBox;
? ? ? ? ? ? ssl_point.Text = e.Location.ToString();
? ? ? ? ? ? pb.Refresh();
? ? ? ? ? ? if (bIsDraw)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? Point p = limitPoint(e.Location, pictureBox_main.ClientSize);
? ? ? ? ? ? ? ? if (p == startPoint_Draw) return;
? ? ? ? ? ? ? ? Graphics gs = Graphics.FromImage(pb.Image);
? ? ? ? ? ? ? ? if (pictureBox_main.Image != null ?)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ?List<Point> pl = ?getPoint2Point(startPoint_Draw, ?p);
? ? ? ? ? ? ? ? ? ? ?pl.RemoveAt(0);
? ? ? ? ? ? ? ? ? ? ?pts.AddRange(pl);
? ? ? ? ? ? ? ? ? ? ?if (pts.Count >= peninv)
? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ?for (int i = penmod; i < pts.Count; i += peninv)
? ? ? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?gs.DrawImage(blushbmp_curr, pts[i].X - pensize , pts[i].Y - pensize ?, pensize*2, pensize*2);
? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ? ? ?penmod = pts.Count % peninv;
? ? ? ? ? ? ? ? ? ? ? ? ?pts.RemoveRange(0, pts.Count - penmod);
? ? ? ? ? ? ? ? ? ? ?}?
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? gs.Dispose();
? ? ? ? ? ? ? ? startPoint_Draw = p;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? private void pictureBox_main_MouseDown(object sender, MouseEventArgs e)
? ? ? ? {
? ? ? ? ? ? if(e.Button == System.Windows.Forms.MouseButtons.Left)
? ? ? ? ? ? if (bIsDraw == false)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? startPoint_Draw = e.Location;
? ? ? ? ? ? ? ? pts.Clear();
? ? ? ? ? ? ? ? pts.Add(startPoint_Draw);
? ? ? ? ? ? ? ? bIsDraw = true;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? private void pictureBox_main_MouseUp(object sender, MouseEventArgs e)
? ? ? ? {
? ? ? ? ? ? if (bIsDraw == true)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? bIsDraw = false;
? ? ? ? ? ? ? ? if (pictureBox_main.Image != null ? )
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ?pts.Clear();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? pictureBox_main.Refresh(); ??
? ? ? ? ? ? }
? ? ? ? }

如果根據(jù)位移方向加上圖片的角度旋轉(zhuǎn)效果,應(yīng)該會更加接近PS的效果。

3.效果

我使用的畫刷圖就是來源于本文上圖的PS畫刷。

圖中5條畫刷線分別使用間隔1,10,20,40,80。使用不同的原圖,就能得到各種各樣的畫刷。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于C#實現(xiàn)亂碼視頻效果

    基于C#實現(xiàn)亂碼視頻效果

    亂碼視頻效果可能很多人都在抖音看到過,即把一個短視頻,轉(zhuǎn)成數(shù)字、字母等亂碼組成的形式進行播放。本文將用C#實現(xiàn)一下這一效果,感興趣的可以了解一下
    2023-01-01
  • 深入了解c# 匿名類型

    深入了解c# 匿名類型

    這篇文章主要介紹了c# 匿名類型的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C#生成sitemap站點地圖的方法

    C#生成sitemap站點地圖的方法

    C#生成sitemap站點地圖的方法,需要的朋友可以參考一下
    2013-04-04
  • UGUI實現(xiàn)圖片拖拽功能

    UGUI實現(xiàn)圖片拖拽功能

    這篇文章主要為大家詳細(xì)介紹了UGUI實現(xiàn)圖片拖拽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • C#使用for循環(huán)移除HTML標(biāo)記

    C#使用for循環(huán)移除HTML標(biāo)記

    大家在項目開發(fā)階段移除文字中的html標(biāo)記最常用的方法就是使用正則表達式,但是正則表達式不能處理所有的html文檔,所以采用迭代方式會更好,下面小編給大家解答下
    2016-08-08
  • C#中增加SQLite事務(wù)操作支持與使用方法

    C#中增加SQLite事務(wù)操作支持與使用方法

    這篇文章主要介紹了C#中增加SQLite事務(wù)操作支持與使用方法,結(jié)合實例形式分析了C#中針對SQLite事務(wù)操作的添加及使用技巧,需要的朋友可以參考下
    2017-07-07
  • WPF實現(xiàn)動畫效果(六)之路徑動畫

    WPF實現(xiàn)動畫效果(六)之路徑動畫

    這篇文章介紹了WPF實現(xiàn)動畫效果之路徑動畫,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#多線程傳遞參數(shù)及任務(wù)用法示例

    C#多線程傳遞參數(shù)及任務(wù)用法示例

    這篇文章主要介紹了C#多線程傳遞參數(shù)及任務(wù)用法,結(jié)合簡單實例形式分析了C#多線程的使用及相關(guān)的參數(shù)傳遞與任務(wù)創(chuàng)建等使用技巧,需要的朋友可以參考下
    2016-06-06
  • C#實現(xiàn)QQ郵箱發(fā)送郵件

    C#實現(xiàn)QQ郵箱發(fā)送郵件

    今天小編就為大家分享一篇關(guān)于C#實現(xiàn)QQ郵箱發(fā)送郵件,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • C#中子類調(diào)用父類的實現(xiàn)方法

    C#中子類調(diào)用父類的實現(xiàn)方法

    這篇文章主要介紹了C#中子類調(diào)用父類的實現(xiàn)方法,通過實例逐步分析了類中初始化構(gòu)造函數(shù)的執(zhí)行順序問題,有助于加深對C#面向?qū)ο蟪绦蛟O(shè)計的理解,需要的朋友可以參考下
    2014-09-09

最新評論

沅江市| 铅山县| 乐昌市| 徐州市| 万盛区| 紫阳县| 师宗县| 砚山县| 美姑县| 韩城市| 措美县| 呈贡县| 石嘴山市| 习水县| 龙口市| 江阴市| 岱山县| 根河市| 玛曲县| 鹤庆县| 博兴县| 彩票| 红安县| 余江县| 延庆县| 西充县| 徐州市| 沙河市| 峨眉山市| 淮北市| 改则县| 伊金霍洛旗| 砀山县| 邯郸县| 房山区| 荥阳市| 茶陵县| 五峰| 平邑县| 防城港市| 霍城县|