很久就注意到了逼乎在注冊時那兩套驗證方式其中一種,就是在七個漢子里邊點擊其中倒立的漢字(隨機1個或者2個倒立的漢字),然后在注冊時返回參數給后台驗證
這里測試了一下錯誤的,嗯,賬號都是瞎寫的,手機號也是隨便寫的,先附張圖
上方圖示的是監測的提交數據,可以看到從上往下,
xsrf:這個是用於防止跨域請求攻擊的,后邊那一串數據是加密計算action token,以用於和服務端的比較,不詳細說了。
然后下邊的幾個表單數據是輸入的注冊數據。
再下邊的captcha是驗證點擊的位置信息,至於前邊加上圖片的大小,這個是為了兼容各個瀏覽器的圖片大小區分,比便於更精確的計算出圖片驗證方式的結果;然后后邊的兩個鼠標點擊的坐標位置。
不知道為什么下邊的captch_type:cn是干嘛的,猜想逼乎還有非chinese的?
最后下邊的那一大坨就是鼠標點擊驗證了,鼠標點擊照片的各個狀態,傳到后台進行驗證是否是模擬點擊的還是手動點擊的
本來只是想做個圖片驗證的,牽扯到其他的就不多說了
正題,這里做的是圖片那一套生成及驗證,也就是captcha這個,其他的有時間再說吧(小弟其他的根本就沒研究!)
先說思路吧,隨機取3700+的常用漢字其中的隨機7個,然后隨機取其中1個或者2個標記為倒立的,然后對這7個漢字進行隨機旋轉-30°~30°(如果按照我原來的思路這里需要記錄下這里旋轉的度數,下方有解釋),放置好位置,然后生成圖片,另一部分參數則是那1個或者2個倒立的漢字的位置。
在前台點擊后的圖片對應坐標參數,傳入后台,然后一系列驗證后,進入坐標驗證,這里我用最簡單的方式,建立坐標軸,然后利用已經計算好的對應倒立漢字的坐標位置及其中心到漢字邊的距離,使用圓的函數來進行判斷傳入的坐標參數是否在圓的里邊,如果是,那么就說明點擊正確,相反則錯誤
(按照原先的方式是這么計算的,每個漢字對應4個邊,然后根據標記的旋轉度數和坐標位置來求出每個邊的坐標函數,再判斷坐標參數是否都在這四個邊內部,也就是這四個邊函數相交的內部,那么就需要計算四次了,但是想了下,還是換這個吧,漢字又不全是方塊的,就改成圓的了)
上方標記的1和2就是兩個倒立的漢字,如果坐標在這兩個漢字對應的紅色的圓內,則為true,其他的都為false
附上代碼片段,這里寫的是個測試,沒怎么整理,由於是個小demo就直接固定了大小,可以根據大小直接求其比例來計算也可以
不知道這樣做是否正確,只是自己研究整理的,dalao們有什么更好的思路也可以分享下

public class VerificationCode_Helper { /// <summary> /// 漢字個數 /// </summary> private static readonly int StrLength = 7; /// <summary> /// 單個漢字寬度 /// </summary> private static readonly int StrWidth = 100; /// <summary> /// 單個漢字高度 /// </summary> private static readonly int StrHeight = 100; public static string GetVerificationCodeAsImageDate(out int[] coord) { Bitmap image = GetVerificationCode(out coord); string imageDate=ImageConvert.ToBase64HtmlString(image, ImageFormat.Gif); return imageDate; } private static Bitmap GetVerificationCode(out int[] coord) { int random1; int random2; List<string> randomHanZiList = RandomHanZi.GetRandomHanZi(StrLength); Bitmap bitmap = CreateImage(randomHanZiList, out random1, out random2); coord = new int[2] { random1, random2 }; return bitmap; } public static bool IsPass(int[]index,float x1, float y1, float x2, float y2) { //前台必須規范圖片大小為250px*60px bool ab1; bool ab2; Coord coord1 = new Coord() { x = x1, y = y1 }; bool a1 = Function(index[0], coord1); bool b1 = Function(index[1], coord1); int indexSecond = -1; if ( ( (a1 && !b1) || (!a1 && b1) ) || ( a1 && (a1 == b1) && (index[0] == index[1]) ) ) { ab1 = true; if (a1) indexSecond = index[1]; else indexSecond = index[0]; } else return false; if (index[0] != index[1]) { Coord coord2 = new Coord() { x = x2, y = y2 }; ab2 = Function(indexSecond, coord2); } else ab2 = true; return ab1 && ab2; } private static bool Function(int index, Coord coord) { if (index >= StrLength || coord.x < 0 || coord.y < 5) { return false; } //更正為 (0,5),(0,35) 橫向間距為30,縱向間距為30 原點位於(-8,-8),那么半徑為16(給大一個像素) //第一個圓的圓心在(15,20) double a = 15.0; double b = 20.0; double r = 16.0; double x = coord.x; double y = coord.y; double widthB = 16.28; a = widthB * (index * 2 + 1); double sockR = Math.Sqrt(Math.Pow((x - a), 2) + Math.Pow((y - b), 2)); return sockR < r; } private static Bitmap CreateImage(List<string> randomHanZiList, out int random1, out int random2) { int int_ImageWidth = StrLength * (StrWidth - 42); Bitmap image = new Bitmap(int_ImageWidth + 10, StrHeight); image.SetResolution(150, 150); Graphics g = Graphics.FromImage(image); g.Clear(Color.White); Random r = new Random(); random1 = r.Next(0, StrLength); random2 = r.Next(0, StrLength); for (int i = 0; i < StrLength; i++) { bool isReversal = random1 == i || random2 == i; int y = 18; if (isReversal) { y = 6; } Point point = new Point(i * (StrWidth - 45), y); g.DrawImage(new VerificationCode_Helper().CreateOneImageChild(randomHanZiList[i], r, isReversal), point); } return image; } public Bitmap CreateOneImageChild(string str, Random r, bool isReversal) { Bitmap img = new Bitmap(StrWidth, StrHeight); img.SetResolution(200, 200); Graphics g = Graphics.FromImage(img); g.Clear(Color.Transparent); Font font = new Font(new FontFamily("仿宋"), 30, FontStyle.Bold); Brush brush = new SolidBrush(Color.Gray); Point point = new Point(0, 0); g.TranslateTransform(StrWidth / 2, StrHeight / 2); if (!isReversal) { double d = r.Next(71, 131) / 100f; g.RotateTransform((float)(90 * d - 90)); } else { double d = r.Next(70, 131) / 100f; g.RotateTransform((float)(180 * d)); } g.RotateTransform(0); StringFormat format = new StringFormat(); format.Alignment = StringAlignment.Center; format.LineAlignment = StringAlignment.Center; g.DrawString(str, font, brush, point, format); g.Dispose(); return img; } } /// <summary> /// 獲取隨機常用漢字 /// </summary> public class RandomHanZi { /// <summary> /// 獲取隨機漢字 /// </summary> /// <param name="strLength">漢字個數</param> /// <returns></returns> public static List<string> GetRandomHanZi(int strLength) { return CreateRegionCode(strLength); } /// <summary> /// 隨機產生漢字 /// </summary> /// <param name="strLength">需要產生漢字的個數</param> /// <returns></returns> private static List<string> CreateRegionCode(int strLength) { string chineseCode; #region 3750個常用漢字 chineseCode = @"啊阿埃挨哎唉哀皚癌藹矮艾礙愛隘鞍氨安俺按暗岸胺案骯昂盎凹敖熬翱襖傲奧懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙壩霸罷爸白柏百擺佰敗拜稗斑班搬扳般頒板版扮拌伴瓣半辦絆邦幫梆榜膀綁棒磅蚌鎊傍謗苞胞包褒剝薄雹保堡飽寶抱報暴豹鮑爆杯碑悲卑北輩背貝鋇倍狽備憊焙被奔苯本笨崩綳甭泵蹦迸逼鼻比鄙筆彼碧蓖蔽畢斃毖幣庇痹閉敝弊必辟壁臂避陛鞭邊編貶扁便變卞辨辯辮遍標彪膘表鱉憋別癟彬斌瀕濱賓擯兵冰柄丙秉餅炳病並玻菠播撥缽波博勃搏鉑箔伯帛舶脖膊渤泊駁捕卜哺補埠不布步簿部怖擦猜裁材才財睬踩采彩菜蔡餐參蠶殘慚慘燦蒼艙倉滄藏操糙槽曹草廁策側冊測層蹭插茬茶查碴搽察岔差詫拆柴豺攙摻蟬饞讒纏鏟產闡顫昌猖場嘗常長償腸廠敞暢唱倡超抄鈔朝嘲潮巢吵炒車扯撤掣徹澈郴臣辰塵晨忱沉陳趁襯撐稱城橙成呈乘程懲澄誠承逞騁秤吃痴持匙池遲弛馳恥齒侈尺赤翅斥熾充沖蟲崇寵抽酬疇躊稠愁籌仇綢瞅丑臭初出櫥廚躇鋤雛滁除楚礎儲矗搐觸處揣川穿椽傳船喘串瘡窗幢床闖創吹炊捶錘垂春椿醇唇淳純蠢戳綽疵茨磁雌辭慈瓷詞此刺賜次聰蔥囪匆從叢湊粗醋簇促躥篡竄摧崔催脆瘁粹淬翠村存寸磋撮搓措挫錯搭達答瘩打大呆歹傣戴帶殆代貸袋待逮怠耽擔丹單鄲撣膽旦氮但憚淡誕彈蛋當擋黨盪檔刀搗蹈倒島禱導到稻悼道盜德得的蹬燈登等瞪凳鄧堤低滴迪敵笛狄滌翟嫡抵底地蒂第帝弟遞締顛掂滇碘點典靛墊電佃甸店惦奠淀殿碉叼雕凋刁掉吊釣調跌爹碟蝶迭諜疊丁盯叮釘頂鼎錠定訂丟東冬董懂動棟侗恫凍洞兜抖斗陡豆逗痘都督毒犢獨讀堵睹賭杜鍍肚度渡妒端短鍛段斷緞堆兌隊對墩噸蹲敦頓囤鈍盾遁掇哆多奪垛躲朵跺舵剁惰墮蛾峨鵝俄額訛娥惡厄扼遏鄂餓恩而兒耳爾餌洱二貳發罰筏伐乏閥法琺藩帆番翻樊礬釩繁凡煩反返范販犯飯泛坊芳方肪房防妨仿訪紡放菲非啡飛肥匪誹吠肺廢沸費芬酚吩氛分紛墳焚汾粉奮份忿憤糞豐封楓蜂峰鋒風瘋烽逢馮縫諷奉鳳佛否夫敷膚孵扶拂輻幅氟符伏俘服浮涪福袱弗甫撫輔俯釜斧脯腑府腐赴副覆賦復傅付阜父腹負富訃附婦縛咐噶嘎該改概鈣蓋溉干甘桿柑竿肝趕感稈敢贛岡剛鋼缸肛綱崗港杠篙皋高膏羔糕搞鎬稿告哥歌擱戈鴿胳疙割革葛格蛤閣隔鉻個各給根跟耕更庚羹埂耿梗工攻功恭龔供躬公宮弓鞏汞拱貢共鈎勾溝苟狗垢構購夠辜菇咕箍估沽孤姑鼓古蠱骨谷股故顧固雇刮瓜剮寡掛褂乖拐怪棺關官冠觀管館罐慣灌貫光廣逛瑰規圭硅歸龜閨軌鬼詭癸桂櫃跪貴劊輥滾棍鍋郭國果裹過哈骸孩海氦亥害駭酣憨邯韓含涵寒函喊罕翰撼捍旱憾悍焊汗漢夯杭航壕嚎豪毫郝好耗號浩呵喝荷菏核禾和何合盒貉閡河涸赫褐鶴賀嘿黑痕很狠恨哼亨橫衡恆轟哄烘虹鴻洪宏弘紅喉侯猴吼厚候后呼乎忽瑚壺葫胡蝴狐糊湖弧虎唬護互滬戶花嘩華猾滑畫划化話槐徊懷淮壞歡環桓還緩換患喚瘓豢煥渙宦幻荒慌黃磺蝗簧皇凰惶煌晃幌恍謊灰揮輝徽恢蛔回毀悔慧卉惠晦賄穢會燴匯諱誨繪葷昏婚魂渾混豁活伙火獲或惑霍貨禍擊圾基機畸稽積箕肌飢跡激譏雞姬績緝吉極棘輯籍集及急疾汲即嫉級擠幾脊己薊技冀季伎祭劑悸濟寄寂計記既忌際繼紀嘉枷夾佳家加莢頰賈甲鉀假稼價架駕嫁殲監堅尖箋間煎兼肩艱緘繭檢柬鹼礆揀撿簡儉剪減薦檻鑒踐見鍵箭件健艦劍餞漸濺澗建僵姜將漿江疆蔣槳獎講匠醬降蕉椒礁焦膠交郊澆驕嬌嚼攪鉸矯僥腳狡角餃繳絞剿教酵轎較叫窖揭接皆秸街階截劫節桔傑捷睫竭潔結解姐戒藉芥界借介疥誡屆巾筋斤金今津襟緊錦僅謹進靳晉禁近燼浸盡勁荊兢莖睛晶鯨京驚精粳經井警景頸靜境敬鏡徑痙靖竟競凈炯窘揪究糾玖韭久灸九酒廄救舊臼舅咎就疚鞠拘狙疽居駒菊局咀矩舉沮聚拒據巨具距踞鋸俱句懼炬劇捐鵑娟倦眷卷絹撅攫抉掘倔爵覺決訣絕均菌鈞軍君峻俊竣浚郡駿喀咖卡咯開揩楷凱慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕顆科殼咳可渴克刻客課肯啃墾懇坑吭空恐孔控摳口扣寇枯哭窟苦酷庫褲誇垮挎跨胯塊筷儈快寬款匡筐狂框礦眶曠況虧盔巋窺葵奎魁傀饋愧潰坤昆捆困括擴廓闊垃拉喇蠟臘辣啦萊來賴藍婪欄攔籃闌蘭瀾讕攬覽懶纜爛濫琅榔狼廊郎朗浪撈勞牢老佬姥酪烙澇勒樂雷鐳蕾磊累儡壘擂肋類淚棱楞冷厘梨犁黎籬狸離漓理李里鯉禮莉荔吏栗麗厲勵礫歷利傈例俐痢立粒瀝隸力璃哩倆聯蓮連鐮廉憐漣簾斂臉鏈戀煉練糧涼梁粱良兩輛量晾亮諒撩聊僚療燎寥遼潦了撂鐐廖料列裂烈劣獵琳林磷霖臨鄰鱗淋凜賃吝拎玲菱零齡鈴伶羚凌靈陵嶺領另令溜琉榴硫餾留劉瘤流柳六龍聾嚨籠窿隆壟攏隴樓婁摟簍漏陋蘆盧顱廬爐擄鹵虜魯麓碌露路賂鹿潞祿錄陸戮驢呂鋁侶旅履屢縷慮氯律率濾綠巒攣孿灤卵亂掠略掄輪倫侖淪綸論蘿螺羅邏鑼籮騾裸落洛駱絡媽麻瑪碼螞馬罵嘛嗎埋買麥賣邁脈瞞饅蠻滿蔓曼慢漫謾芒茫盲氓忙莽貓茅錨毛矛鉚卯茂冒帽貌貿么玫枚梅酶霉煤沒眉媒鎂每美昧寐妹媚門悶們萌蒙檬盟錳猛夢孟眯醚靡糜迷謎彌米秘覓泌蜜密冪棉眠綿冕免勉娩緬面苗描瞄藐秒渺廟妙蔑滅民抿皿敏憫閩明螟鳴銘名命謬摸摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌謀牟某拇牡畝姆母墓暮幕募慕木目睦牧穆拿哪吶鈉那娜納氖乃奶耐奈南男難囊撓腦惱鬧淖呢餒內嫩能妮霓倪泥尼擬你匿膩逆溺蔫拈年碾攆捻念娘釀鳥尿捏聶孽嚙鑷鎳涅您檸獰凝寧擰濘牛扭鈕紐膿濃農弄奴努怒女暖虐瘧挪懦糯諾哦歐鷗毆藕嘔偶漚啪趴爬帕怕琶拍排牌徘湃派攀潘盤磐盼畔判叛乓龐旁耪胖拋咆刨炮袍跑泡呸胚培裴賠陪配佩沛噴盆砰抨烹澎彭蓬棚硼篷膨朋鵬捧碰坯砒霹批披劈琵毗啤脾疲皮匹痞僻屁譬篇偏片騙飄漂瓢票撇瞥拼頻貧品聘乒坪蘋萍平憑瓶評屏坡潑頗婆破魄迫粕剖撲鋪仆莆葡菩蒲埔朴圃普浦譜曝瀑期欺棲戚妻七凄漆柒沏其棋奇歧畦崎臍齊旗祈祁騎起豈乞企啟契砌器氣迄棄汽泣訖掐洽牽扦釺鉛千遷簽仟謙乾黔錢鉗前潛遣淺譴塹嵌欠歉槍嗆腔羌牆薔強搶橇鍬敲悄橋瞧喬僑巧鞘撬翹峭俏竅切茄且怯竊欽侵親秦琴勤芹擒禽寢沁青輕氫傾卿清擎晴氰情頃請慶瓊窮秋丘邱球求囚酋泅趨區蛆曲軀屈驅渠取娶齲趣去圈顴權醛泉全痊拳犬券勸缺炔瘸卻鵲榷確雀裙群然燃冉染瓤壤攘嚷讓饒擾繞惹熱壬仁人忍韌任認刃妊紉扔仍日戎茸蓉榮融熔溶容絨冗揉柔肉茹蠕儒孺如辱乳汝入褥軟阮蕊瑞銳閏潤若弱撒灑薩腮鰓塞賽三叄傘散桑嗓喪搔騷掃嫂瑟色澀森僧莎砂殺剎沙紗傻啥煞篩曬珊苫杉山刪煽衫閃陝擅贍膳善汕扇繕墒傷商賞晌上尚裳梢捎稍燒芍勺韶少哨邵紹奢賒蛇舌舍赦攝射懾涉社設砷申呻伸身深娠紳神沈審嬸甚腎慎滲聲生甥牲升繩省盛剩勝聖師失獅施濕詩屍虱十石拾時什食蝕實識史矢使屎駛始式示士世柿事拭誓逝勢是嗜噬適仕侍釋飾氏市恃室視試收手首守壽授售受瘦獸蔬樞梳殊抒輸叔舒淑疏書贖孰熟薯暑曙署蜀黍鼠屬術述樹束戍豎墅庶數漱恕刷耍摔衰甩帥栓拴霜雙爽誰水睡稅吮瞬順舜說碩朔爍斯撕嘶思私司絲死肆寺嗣四伺似飼巳松聳慫頌送宋訟誦搜艘擻嗽蘇酥俗素速粟僳塑溯宿訴肅酸蒜算雖隋隨綏髓碎歲穗遂隧祟孫損筍蓑梭唆縮瑣索鎖所塌他它她塔獺撻蹋踏胎苔抬台泰酞太態汰坍攤貪癱灘壇檀痰潭譚談坦毯袒碳探嘆炭湯塘搪堂棠膛唐糖倘躺淌趟燙掏濤滔絛萄桃逃淘陶討套特藤騰疼謄梯剔踢銻提題蹄啼體替嚏惕涕剃屜天添填田甜恬舔腆挑條迢眺跳貼鐵帖廳聽烴汀廷停亭庭挺艇通桐酮瞳同銅彤童桶捅筒統痛偷投頭透凸禿突圖徒途塗屠土吐兔湍團推頹腿蛻褪退吞屯臀拖托脫鴕陀馱駝橢妥拓唾挖哇蛙窪娃瓦襪歪外豌彎灣玩頑丸烷完碗挽晚皖惋宛婉萬腕汪王亡枉網往旺望忘妄威巍微危韋違桅圍唯惟為濰維葦萎委偉偽尾緯未蔚味畏胃喂魏位渭謂尉慰衛瘟溫蚊文聞紋吻穩紊問嗡翁瓮撾蝸渦窩我斡卧握沃巫嗚鎢烏污誣屋無蕪梧吾吳毋武五捂午舞伍侮塢戊霧晤物勿務悟誤昔熙析西硒矽晰嘻吸錫犧稀息希悉膝夕惜熄烯溪汐犀檄襲席習媳喜銑洗系隙戲細瞎蝦匣霞轄暇峽俠狹下廈夏嚇掀杴先仙鮮纖咸賢銜舷閑涎弦嫌顯險現獻縣腺餡羡憲陷限線相廂鑲香箱襄湘鄉翔祥詳想響享項巷橡像向象蕭硝霄削哮囂銷消宵淆曉小孝校肖嘯笑效楔些歇蠍鞋協挾攜邪斜脅諧寫械卸蟹懈泄瀉謝屑薪芯鋅欣辛新忻心信釁星腥猩惺興刑型形邢行醒幸杏性姓兄凶胸匈洶雄熊休修羞朽嗅銹秀袖綉墟戌需虛噓須徐許蓄酗敘旭序畜恤絮婿緒續軒喧宣懸旋玄選癬眩絢靴薛學穴雪血勛熏循旬詢尋馴巡殉汛訓訊遜迅壓押鴉鴨呀丫芽牙蚜崖衙涯雅啞亞訝焉咽閹煙淹鹽嚴研蜒岩延言顏閻炎沿奄掩眼衍演艷堰燕厭硯雁唁彥焰宴諺驗殃央鴦秧楊揚佯瘍羊洋陽氧仰癢養樣漾邀腰妖瑤搖堯遙窯謠姚咬舀葯要耀椰噎耶爺野冶也頁掖業葉曳腋夜液一壹醫揖銥依伊衣頤夷遺移儀胰疑沂宜姨彝椅蟻倚已乙矣以藝抑易邑屹億役臆逸肄疫亦裔意毅憶義益溢詣議誼譯異翼翌繹茵蔭因殷音陰姻吟銀淫寅飲尹引隱印英櫻嬰鷹應纓瑩螢營熒蠅迎贏盈影穎硬映喲擁佣臃癰庸雍踴蛹詠泳涌永恿勇用幽優悠憂尤由郵鈾猶油游酉有友右佑釉誘又幼迂淤於盂榆虞愚輿余俞逾魚愉渝漁隅予娛雨與嶼禹宇語羽玉域芋郁吁遇喻峪御愈欲獄育譽浴寓裕預豫馭鴛淵冤元垣袁原援轅園員圓猿源緣遠苑願怨院曰約越躍鑰岳粵月悅閱耘雲鄖勻隕允運蘊醞暈韻孕匝砸雜栽哉災宰載再在咱攢暫贊贓臟葬遭糟鑿藻棗早澡蚤躁噪造皂灶燥責擇則澤賊怎增憎曾贈扎喳渣札軋鍘閘眨柵榨咋乍炸詐摘齋宅窄債寨瞻氈詹粘沾盞斬輾嶄展蘸棧占戰站湛綻樟章彰漳張掌漲杖丈帳賬仗脹瘴障招昭找沼趙照罩兆肇召遮折哲蟄轍者鍺蔗這浙珍斟真甄砧臻貞針偵枕疹診震振鎮陣蒸掙睜征猙爭怔整拯正政幀症鄭證芝枝支吱蜘知肢脂汁之織職直植殖執值侄址指止趾只旨紙志摯擲至致置幟峙制智秩稚質炙痔滯治窒中盅忠鍾衷終種腫重仲眾舟周州洲謅粥軸肘帚咒皺宙晝驟珠株蛛朱豬諸誅逐竹燭煮拄矚囑主著柱助蛀貯鑄築住注祝駐抓爪拽專磚轉撰賺篆樁庄裝妝撞壯狀椎錐追贅墜綴諄准捉拙卓桌琢茁酌啄着灼濁茲咨資姿滋淄孜紫仔籽滓子自漬字鬃棕蹤宗綜總縱鄒走奏揍租足卒族祖詛阻組鑽纂嘴醉最罪尊遵昨左佐柞做作坐座"; #endregion int codeNum = chineseCode.Length; Random rd = new Random(); List<string> strList = new List<string>(); for (int i = 0; i < strLength; i++) { strList.Add(chineseCode[rd.Next(codeNum)].ToString()); } return strList; } } public class ImageConvert { /// <summary> /// Image轉字節流 /// </summary> /// <param name="img">Image</param> /// <param name="format">Image格式</param> /// <returns></returns> public static string ToBase64String(Image img, ImageFormat format) { if (img != null) { using (MemoryStream ms = new MemoryStream()) { img.Save(ms, format); byte[] buffer = ms.ToArray(); return Convert.ToBase64String(buffer); } } return string.Empty; } public static string ToBase64HtmlString(Image img, ImageFormat format) { string type = "jpeg"; if (format.Guid == ImageFormat.Png.Guid) { type = "png"; } else if (format.Guid == ImageFormat.Gif.Guid) { type = "gif"; } return string.Format("data:image/{0};base64,", type) + ToBase64String(img, format); } public static Image FromBase64String(string base64Str) { Bitmap bitmap = null; Image img = null; using (MemoryStream ms = new MemoryStream()) { byte[] buffer = Convert.FromBase64String(base64Str); ms.Write(buffer, 0, buffer.Length); try { img = Image.FromStream(ms); if (img != null) { bitmap = new Bitmap(img.Width, img.Height); using (Graphics g = Graphics.FromImage(bitmap)) { g.DrawImage(img, new Rectangle(0, 0, bitmap.Width, bitmap.Height)); } } } catch { } } return bitmap; } /// <summary> /// 圖片字節轉Image /// </summary> /// <param name="str">圖片字節</param> /// <returns></returns> public static Image FromBase64HtmlString(string str) { string[] strs = str.Split(','); if (strs.Length > 0) { return FromBase64String(strs[strs.Length - 1]); } else { return FromBase64String(str); } } } public class Coord { public float x { get; set; } public float y { get; set; } }