Data Url生成工具C#版 第二版

为什么有第二版



??首先感谢 jenlynn 同学的留言“DATA URL两种生成方式,C#和HTML5 两者同一张生成的base64编码貌似不一样,能有什么方法让他们达成一致吗”。

??其次,在研究这个问题时发现了Bug和异常。

Bug:图片编码判断问题,不管什么扩展名的都默认使用了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;
                }

检测到 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#版 第二版完整源码下载

资源分定的比较高,下载后评论会返还的。

相关文章



用Visual Studio 2010编写Data Url生成工具C#版

检测到 ContextSwitchDeadlock

Data Url生成工具之HTML5 FileReader实现

提出一个问题


C#如何高效的向TextBox写入一个很长的字符串?

鄙人不才,几番努力都未能解决这个问题,特在此向大家学习请教!

时间: 2024-10-04 12:18:41

Data Url生成工具C#版 第二版的相关文章

用Visual Studio 2010编写Data Url生成工具C#版

声明:本文系本人依照真实经历原创,未经许可,谢绝转载. 此文百度经验版本:如何用Visual Studio 2010打造Data Url生成工具 源码下载:用Visual Studio 2010编写Data Url生成工具C#源码 什么是Data Url呢?Data URI scheme是在RFC2397中定义的,目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入. 例如: <img src="data:image/png;base64,iVBORw0KGgoAAAANSUh

Data Url生成工具之HTML5 FileReader实现

百度经验版本:如何用HTML5的FileReader生成Data Url 上一篇讲了:用Visual Studio 2010编写Data Url生成工具C#版 今天用HTML5 FileReader实现了一下Data Url生成工具,上代码吧: <!DOCTYPE html <html xmlns="http://www.w3.org/1999/xhtml" > <head> <meta http-equiv="Content-Type&q

HTML5——Data Url生成

HTML5——Data Url生成 1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta charset="utf-8" /> 6 <title>如何用HTML5的FileReader生成Data Url</title> 7 8 <script type="text/javascript"> 9 function imageDataUrl(sou

泛泰A820L (高通MSM8660 cpu) 3.4内核的CM10.1(Android 4.2.2) 測试版第二版

欢迎关注泛泰非盈利专业第三方开发团队 VegaDevTeam  (本team 由 syhost suky zhaochengw(z大) xuefy(大星星) tenfar(R大师) loogeo crazyi(天下无雪) windxixi(雪狐) wangsai008 组成) 感谢: tenfar(R大师),zhaochengw(z大),xuefy(大星星).suky,wzhy90 特别说明: 此版本号仅为測试版, 用于測试反馈bug(本人已经測试将近10天),  由于3.4内核的MSM8660

《编程珠玑》高清 pdf版 第二版

作者: [美] Jon Bentley 出版社: 人民邮电出版社 副标题: 第2版 原作名: Programming Pearls Second Edition 译者: 黄倩 / 钱丽艳 出版年: 2008-10 页数: 228 定价: 39.00元 装帧: 平装 内容简介 · · · · · · 本书是计算机科学方面的经典名著.书的内容围绕程序设计人员面对的一系列实际问题展开.作者Jon Bentley 以其独有的洞察力和创造力,引导读者理解这些问题并学会解决方法,而这些正是程序员实际编程生涯

Javadoc文档生成工具-自定义版

先上图来一波 本身JDK自带了doc文档生成工具,但是不支持排除类,方法,属性,虽然有个@deprecated可以使用,但是达不到我想要的结果(类会被标记为废弃类,编译使用时会提示), 而且类说明示例代码不支持高亮,排版也不行,搜索万能的网友的答案,发现没找到合适的,,,然后就开始漫长的实现.虽然有些地方不完善,没有完全按照官方的全部实现. 1.实现的功能 几十种代码高亮的样式,结合自开源的js. @exclude排除生成类.方法.属性 @link高亮提示 自定义布局比例 以及一些简单注解@ve

(备忘)Nginx中文手册(技术指南第二版)

Nginx 常见应用技术指南[Nginx Tips] 第二版 目 录 一. Nginx 基础知识二. Nginx 安装及调试三. Nginx Rewrite四. Nginx Redirect五. Nginx 目录自动加斜线:六. Nginx Location七. Nginx expires八. Nginx 防盗链九. Nginx 访问控制十. Nginx日志处理十一. Nginx Cache十二. Nginx 负载均衡十三. Nginx简单优化十四. 如何构建高性能的LEMP环境十五. Ngin

js仿百度文库文档上传页面的分类选择器_第二版

仿百度文库文档上传页面的多级联动分类选择器第二版,支持在一个页面同时使用多个分类选择器: 此版本把HTML,CSS,以及图片都封装到"category.js"中,解决因文件路径找不到样式及图片的问题: 源码下载地址:http://download.csdn.net/detail/testcs_dn/7290577 初始状态,一个页面使用两个,可以初始化之前选中的分类: 选择状态: 当选中一个分类后,会触发"onChange"事件,如上图中的"您选择的分类编

第二版博客首页安装代码

css: #profile_block{text-align:center;position:absolute; top:60px; right:10px;} #blog-calendar{border-radius: 7px;background:#fff;} #p_b_follow{padding-top:10px;} #p_b_follow a{display:block;width:70px;height:35px; line-height:35px;mrgin-top:10px; te