우선, "생성 방법에는 두 가지가 있습니다"라는 메시지를 보내주신 동급생 jenlynn에게 감사드립니다. DATA URL, C#, HTML5 모두 동일합니다. 생성된 base64 인코딩이 다른 것 같은데, 일치하게 할 수 있는 방법이 있나요?"
둘째, 이 문제를 조사하던 중 버그와 이상 징후가 발견되었습니다.
버그: 이미지 인코딩 판단 문제, 확장자에 관계없이 기본적으로 PNG 인코딩이 사용됩니다.
예외: ContextSwitchDeadlock 감지
는 주로 획득한 확장자 앞에 점이 있다는 사실을 잊어버렸기 때문에 발생했습니다.
관련 코드:
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; }
해결 방법 설명
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#의 두 번째 버전 샘플 코드에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!