ホームページ  >  記事  >  バックエンド開発  >  データ URL 生成ツール C# の第 2 バージョンのサンプル コードの詳細な紹介

データ URL 生成ツール C# の第 2 バージョンのサンプル コードの詳細な紹介

黄舟
黄舟オリジナル
2017-03-11 13:48:161896ブラウズ

なぜ第二版があるのですか? DATA URL を生成する方法は C# と HTML5 の 2 つがあるようですが、同じ画像から生成される Base64 エンコーディングが異なるようです。合意? "。


第二に、この問題の調査中にバグと異常が発見されました。

バグ: 画像エンコード判定の問題。拡張子に関係なく、デフォルトで PNG エンコードが使用されます。

例外: ContextSwitchDeadlock が検出されました

インターフェースプレビュー



関連問題の改善方法

データ URL 生成ツール C# の第 2 バージョンのサンプル コードの詳細な紹介画像エンコード判定問題

以前は、先頭にドットが付いた拡張子の取得を忘れていたことが主な原因でした

関連コード:
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 文字列を保存し、コピー ボタンをクリックしたときにそれをコピーすることしかできません。をクリックして 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;
        }

以上がデータ URL 生成ツール C# の第 2 バージョンのサンプル コードの詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。