爲了避免耽誤你們的時間,這裏首先說一下下邊文章中主要涉及的技術問題,若是有興趣,你們能夠一塊兒研究一下,若是不喜歡,請繞道。寫得不妥的地方,也但願你們指正。git
本文主要說三個問題:程序員
1、VS中跨工程調試,從一個工程進入另外一個工程;github
2、動態生成二維碼和一維條形碼;服務器
3、前臺頁面直接訪問圖片流文件。微信
老規矩,先來點題外話。最近在園子裏閒逛的時候,發現不少人都聊到了加班這個話題。其中有一哥們兒說是在京東,而後天天按時上下班,無不良記錄,一個月後竟然以工做不積極給開了……說到這裏不少人就得有想法了,憑什麼啊?說到程序員加班,彷佛永遠是個談不完的話題,好像程序員就是爲加班而生的。而這其中的辛酸血淚,也只有咱們本身才知道。從去年進入公司以來,除了特殊狀況(節假日,公司聚會),歷來未按時下過班,你們都習慣磨磨蹭蹭,沒事兒也在那兒耗着。我也問過比我先來的同事,爲何下班了還不走,緣由很簡單,上邊的人都沒走……ide
最近加班更是頻繁,週一到週四住在公司,天天回寢室都是下半夜。其中的苦楚,說不清,道不明。我想說的是,咱們一塊兒,按時下班吧。工做和生活須要分開!工具
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————編碼
1、跨工程調試spa
以前工做時發現要將項目中一部分的功能加以改造移動到另一個項目去,本着DRY的原則,決定將項目生成一下,而後直接把dll複製過去。當複製過去直接使用時,發現程序報了空指針異常。而檢查了一遍程也未發現有任何地方會致使空指針,惟一的辦法就是打斷點來調試一下,但是因爲是引用的dll,因此沒辦法直接打斷點,只能經過其餘的方式。好在我有dll的源碼,如何調試只是方法的問題了。這裏說的跨工程調試,是指調試在不一樣的工程中的源代碼。在同一個工程不一樣項目的代碼是能夠直接調試的。下面簡單的介紹一下如何跨工程進行調試。指針
首先,找到須要調試的CS文件,而後將文件直接拖到正在運行的工程窗口中,將斷點打在合適的位置上。再從原工程中找到此cs所在的項目的pdb文件,將pdb文件和dll一同複製到現工程的bin目錄下,而後直接F5,接着,奇蹟就發生了。
2、生成二維碼和一維條形碼
隨着微信的興起,二維碼應用得愈來愈普遍。以前咱們有個賣水果的客戶說是要將二維碼貼在水果上,經過手機一掃就能知道水果的產地,生長環境等信息。網上也有不少生成二維碼的工具,可是但願你們慎用,有些會把您填寫的信息祕密發回服務器,固然了,大多數仍是能夠用的。
文中提到的生成二維碼和一維條形碼,是經過開源的項目Zxing來實現的,其Github地址:https://github.com/zxing/zxing/,這是一個開源的項目,能夠生成各類碼。由於以前用了二維碼和條形碼,因此這裏簡單的說一下。
生成二維碼和一維碼只有細微的差異,體如今程序裏至關於使用了不一樣類型的枚舉。下面直接上代碼:
在這裏作這個示例用的是最傳統的Web程序,直接添加了一個通常處理程序來處理這個生成二維碼和一維條形碼的邏輯。
首先經過context上下文獲取傳過來的一些參數:
string content = context.Request.QueryString["content"]; if (string.IsNullOrWhiteSpace(content)) return; content = HttpUtility.UrlDecode(content); string level = context.Request.QueryString["level"]; level = string.IsNullOrWhiteSpace(level) ? "M" : level.ToUpper(); string format = context.Request.QueryString["format"]; format = string.IsNullOrWhiteSpace(format) ? "png" : format.ToLower(); int margin = Convert.ToInt32(context.Request.QueryString["margin"]); int size = Convert.ToInt32(context.Request.QueryString["size"]);
而後經過前臺傳過來的參數生成相應的條碼類型,這裏僅僅只是生成了一維碼和二維碼,別的相似:
ErrorCorrectionLevel errorCorrectionLevel; ImageFormat imgFormat; BarcodeFormat barcodeFormat = GetImageFormat(context.Request.QueryString["mod"]); #region 獲取生成圖片類型 private static BarcodeFormat GetImageFormat(string mod) { switch (mod) { case "QR_CODE": return BarcodeFormat.QR_CODE; case "CODE_128": return BarcodeFormat.CODE_128; default: return BarcodeFormat.CODE_128; } } #endregion
接着,再初始化一些參數:
#region ErrorCorrectionLevel switch (level) { case "L": errorCorrectionLevel = ErrorCorrectionLevel.L; break; case "M": errorCorrectionLevel = ErrorCorrectionLevel.M; break; case "Q": errorCorrectionLevel = ErrorCorrectionLevel.Q; break; case "H": errorCorrectionLevel = ErrorCorrectionLevel.H; break; default: errorCorrectionLevel = ErrorCorrectionLevel.M; break; } #endregion #region ImageFormat switch (format) { case "jpeg": imgFormat = ImageFormat.Jpeg; break; case "gif": imgFormat = ImageFormat.Gif; break; case "bmp": imgFormat = ImageFormat.Bmp; break; default: imgFormat = ImageFormat.Png; break; } #endregion EncodingOptions options = new QrCodeEncodingOptions { DisableECI = true, //禁用ECI編碼段: use UTF-8 encoding and the ECI segment is omitted CharacterSet = "UTF-8", //使用UTF-8編碼 Width = 200, //設置寬度 Height = 80, //設置高度 Margin = 20, //設置間隙 ErrorCorrection = errorCorrectionLevel,//容錯等級 PureBarcode = false//底部顯示內容 };
最後,直接生成二維碼或一維碼圖片:
BarcodeWriter writer = new BarcodeWriter(); writer.Format = barcodeFormat; //採用QR編碼 writer.Options = options; context.Response.Clear(); context.Response.ContentType = imgFormat.GetMimeType(); //設置輸出流ContentType using (Bitmap image = writer.Write(content)) //輸出二維碼圖像 { using (MemoryStream ms = new MemoryStream()) { image.Save(ms, imgFormat); ms.WriteTo(context.Response.OutputStream); } } context.Response.Output.Flush(); context.Response.End();
至此,生成一維碼或二維碼告一段落。
3、輸出圖片到前臺
看完生成條碼的童鞋會發現,最後是將流輸出了,是的,這是爲了直接將圖片輸出到前臺。這樣,能夠根據實時的動態請求,將須要生成的一維碼或者二維碼直接輸出到前臺,而前臺的頁面也很是簡單,只需寫一個<image>標籤,將src指向後臺的通常處理程序便可。這樣就能將內容輸出到前臺。如圖:固然了,您也能夠根據本身的須要,在二維碼中間穿插上本身的一些Logo或者圖片信息,因爲本文重在拋磚引玉,因此這裏就不細說了。