Maison > Article > développement back-end > Introduction détaillée à l'exemple de code de la deuxième version de l'outil de génération d'URL de données C#
Tout d'abord, merci à sa camarade de classe Jenlynn pour son message "Il y a deux façons de générer URL DE DONNÉES, C# et HTML5, les deux sont identiques. L'encodage base64 généré semble être différent, existe-t-il un moyen de les mettre en accord ?"
Deuxièmement, des bugs et des anomalies ont été trouvés lors de la recherche sur ce problème.
Bogue : Problème de jugement d'encodage d'image, quelle que soit l'extension, l'encodage PNG est utilisé par défaut.
Exception : ContextSwitchDeadlock détecté
était principalement dû à l'oubli que l'extension obtenue est précédée d'un point
Code associé :
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; }
Description de la solution
StackOverflow a mentionné l'utilisation de BackgroundWorker, j'utilise des threads ici cependant, après des tests, il a été constaté qu'en raison de problèmes de performances lorsque TextBox affiche un texte volumineux, lorsque les threads interagissent avec TextBox, si l'utilisateur n'opère pas, la fenêtre ne sera pas Il mourra ; une fois qu'une opération est effectuée, la fenêtre ne répondra pas !
Nous ne pouvons donc que changer la solution, utiliser une méthode de compromis, ne pas laisser TextBox afficher l'intégralité de la chaîne DataUrl, n'en afficher qu'une partie ; utiliser une variable "" pour enregistrer la chaîne DataUrl complète, et cliquer sur le bouton Copier. pour le copier dans le presse-papiers de Windows.
Code associé
/// <summary> /// 用于保存完整的DataUrl /// </summary> private string fullDataUrl = string.Empty;
Utiliser les fils de discussion
//创建线程来生成DataUrl System.Threading.Thread thd = new System.Threading.Thread(new ParameterizedThreadStart(buildDataUrl)); thd.Start(textBox_saveDir.Text);
Utiliser les délégués
/// <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)); } }
Optimiser l'encodage 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; }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!