詳細介紹Data Url產生工具C#版第二版的範例程式碼

黄舟
發布: 2017-03-11 13:48:16
原創
1860 人瀏覽過

為什麼有第二版


  首先感謝jenlynn 同學的留言「DATA URL兩種產生方式,C#和HTML5 兩者同一張生成的base64編碼貌似不一樣,能有什麼方法讓他們達成一致嗎」。

  其次,在研究這個問題時發現了Bug和例外。
Bug:圖片編碼判斷問題,不管什麼副檔名的都預設使用了PNG編碼。
異常:偵測到ContextSwitchDeadlock

介面預覽


詳細介紹Data Url產生工具C#版第二版的範例程式碼

#針對相關問題的改進方法


##圖片編碼判斷問題

之前主要是忘記了獲取的擴展名前面是帶點.的

相關代碼:

string ext = Path.GetExtension(path).ToLower();
                //根据文件的扩展名确定使用的编码格式
                //注意扩展名是带点的!
                switch (ext)
                {
                    case ".gif":
                        fmt = System.Drawing.Imaging.ImageFormat.Gif;
                        break;
                    case ".jpg":
                    case ".jpeg":
                        fmt = System.Drawing.Imaging.ImageFormat.Jpeg;
                        break;
                    case ".ico":
                        fmt = System.Drawing.Imaging.ImageFormat.Icon;
                        break;
                    default:
                        ext = "png";
                        break;
                }
登入後複製

檢測到ContextSwitchDeadlock

解決方法說明 StackOverflow提到使用BackgroundWorker,我在這裡使用線程;但是經過測試發現:由於TextBox顯示大文本時的性能問題,線程與TextBox交互時,如果用戶不操作的話,窗口不會死;一旦有任何操作,視窗就是不響應!
所以只能改變解決方案,使用折中的辦法,不讓TextBox顯示全部的DataUrl字串,只顯示其中的一部分;使用一個變數「」來保存完整的DataUrl字串,點擊複製按鈕時將其Copy到Windows剪貼簿中。

相關程式碼

        /// <summary>
        /// 用于保存完整的DataUrl
        /// </summary>
        private string fullDataUrl = string.Empty;
登入後複製

使用執行緒

                //创建线程来生成DataUrl
                System.Threading.Thread thd = new System.Threading.Thread(new ParameterizedThreadStart(buildDataUrl));
                thd.Start(textBox_saveDir.Text);
登入後複製

使用委託

        /// <summary>
        /// TextBox委托,用于实现线程中访问窗体、组件等的线程安全性
        /// </summary>
        /// <param name="msg"></param>
        public delegate void textbox_delegate(string msg);        /// <summary>
        /// TextBox委托实现,用于实现线程中访问窗体、组件等的线程安全性
        /// </summary>
        /// <param name="msg"></param>
        public void textboxset(string msg)
        {            if (textBox1 == null) return;            
        if (textBox1.InvokeRequired)
            {
                textbox_delegate dt = new textbox_delegate(textboxset);
                textBox1.Invoke(dt, new object[] { msg });
            }            
            else
            {                
            int strLen = msg.Length;                
            int step = 100;                
            while (strLen > step)
                {
                    textBox1.AppendText(msg.Substring(msg.Length - strLen, step));
                    strLen -= step;
                }
                textBox1.AppendText(msg.Substring(msg.Length - strLen, strLen));
            }
        }
登入後複製

優化Base64編碼

                //计算Base64编码的字符串后部分有多少可以省略的字符
                int strLen = str.Length;
                string dyzf = str.Substring(strLen - 1, 1);                
                while ((dyzf == "A" || dyzf == "=") && strLen > 0)
                {
                    strLen -= 1;
                    dyzf = str.Substring(strLen - 1, 1);
                }                //组合完整的Data Url
                fullDataUrl = "<img src=\"data:image/" + ext + ";base64,"
                    + str.Substring(0, strLen)
                    + "\" width=\"" + img.Width + "\" height=\"" + img.Height + "\" />";                
                    //这里定义TextBox最多只显示20000个字符,多余的裁掉不显示了,不然性能太差。
                int showLen = 20000;                if (showLen > fullDataUrl.Length)
                {
                    showLen = fullDataUrl.Length;
                }
                textboxset(fullDataUrl.Substring(0, showLen));
登入後複製
        /// <summary>
        /// 将完整的Data Url复制到Windows剪贴板中。
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button_copy_Click(object sender, EventArgs e)
        {
            Clipboard.SetText(fullDataUrl);
        }
登入後複製
        /// <summary>
        /// 清空文本框
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button_clear_Click(object sender, EventArgs e)
        {
            textBox1.Clear();
            fullDataUrl = string.Empty;
        }
登入後複製

以上是詳細介紹Data Url產生工具C#版第二版的範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!