本文摘自PHP中文网,作者黄舟,侵删。
为什么有第二版
??首先感谢 jenlynn 同学的留言“DATA URL两种生成方式,C#和HTML5 两者同一张生成的base64编码貌似不一样,能有什么方法让他们达成一致吗”。
??其次,在研究这个问题时发现了Bug和异常。
Bug:图片编码判断问题,不管什么扩展名的都默认使用了PNG编码。
异常:检测到 ContextSwitchDeadlock
界面预览

针对相关问题的改进方法
图片编码判断问题
之前主要是忘记了获取的扩展名前面是带点.的
相关代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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剪贴板中。
相关代码
1 2 3 4 | /// <summary>
/// 用于保存完整的DataUrl
/// </summary>
private string fullDataUrl = string .Empty;
|
使用线程
1 2 3 | System.Threading.Thread thd = new System.Threading.Thread( new ParameterizedThreadStart(buildDataUrl));
thd.Start(textBox_saveDir.Text);
|
使用委托
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | /// <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编码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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);
}
fullDataUrl = "<img src=\"data:image/" + ext + ";base64,"
+ str.Substring(0, strLen)
+ "\" width=\"" + img.Width + "\" height=\"" + img.Height + "\" />" ;
int showLen = 20000; if (showLen > fullDataUrl.Length)
{
showLen = fullDataUrl.Length;
}
textboxset(fullDataUrl.Substring(0, showLen));
|
1 2 3 4 5 6 7 8 9 | /// <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);
}
|
1 2 3 4 5 6 7 8 9 10 | /// <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#版第二版的示例代码的详细内容!
相关阅读 >>
详解c# 控制台倒计时
c# winform程序上传图片到指定目录的示例代码
c#接口的实例详解
c# 将Datatable数据导出到excel表格中的示例代码分享
c#通过oledb操作excel实例代码
详解c#把Datatable中数据一次插入数据库的示例代码
c#遍历文件夹子目录下所有图片及遍历文件夹下的文件代码分享
c#泛型类型的详细介绍
c#灵活使用类的方法分享
怎样用c#打印一个n行的菱形?实战详解
更多相关阅读请进入《Data》频道 >>
清华大学出版社
作者:[美]克里斯琴·内格尔(Christian Nagel)著。出版时间:2019年3月。
转载请注明出处:木庄网络博客 » 详细介绍Data Url生成工具C#版第二版的示例代码