Winform 存储截图到mySQL,并显示

1. 用RichText控件,可以直接实现粘贴。

2. MySQL数据库相应字段设为mediumtext型,约16MB,够用啦,再意大小可的可以用TEXT,约64KB,少了点,不要用LongText,可以存4G,但是DataTable读取不了,也没必要这么大啦。

3. 存入前,要进行压缩,简单测试了一下,约可以压缩90%,这意味着我们可以存大概160M的图片,够用了。

插入数据库代码如下:

            StringBuilder sb = new StringBuilder();
            byte[] bytes = Encoding.Default.GetBytes(richTextBox1.Rtf);


            foreach (byte b in bytes)
            {
                sb.Append(b + "|");
            }

            MySqlParameter[] oCmdPrmtLst = {
                       new MySqlParameter("?PROBLEM",  GZip.GZipCompressString(sb.ToString()))
                };


            try
            {
                MySqlHelper.ExecuteNonQuery(MySqlHelper.Conn_Order, CommandType.Text, sSQL, oCmdPrmtLst);
                MessageBox.Show("保存成功!");

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

读取代码:

            try
            {
                MySqlParameter[] oCmdPrmtLst = null;
                dtTest.Load(MySqlHelper.ExecuteReader(MySqlHelper.Conn_Order, CommandType.Text, sSQL,
                                              oCmdPrmtLst));

                string[] strs = GZip.GZipDecompressString(dtTest.Rows[0]["sProblem"].ToString()).Split('|');

                int length = strs.Length;
                byte[] bytes = new byte[length];

                for (int i = 0; i < length; i++)
                {
                    if (strs[i].Trim().Length > 0)
                    {
                        bytes[i] = Convert.ToByte(strs[i]);
                    }
                }
                if (bytes != null)
                {
                    richTextBox1.Rtf = Encoding.Default.GetString(bytes);
                }

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

压缩类,来源于网络

   class GZip
    {

        #region  压缩和解压字符串
        /// <summary>
        /// 将传入字符串以GZip算法压缩后,返回Base64编码字符
        /// </summary>
        /// <param name="rawString">需要压缩的字符串</param>
        /// <returns>压缩后的Base64编码的字符串</returns>
        public static string GZipCompressString(string rawString)
        {
            if (string.IsNullOrEmpty(rawString) || rawString.Length == 0)
            {
                return "";
            }
            else
            {
                byte[] rawData = System.Text.Encoding.UTF8.GetBytes(rawString.ToString());
                byte[] zippedData = Compress(rawData);
                return (string)(Convert.ToBase64String(zippedData));
            }
        }

        /// <summary>
        /// GZip压缩
        /// </summary>
        /// <param name="rawData"></param>
        /// <returns></returns>
        static byte[] Compress(byte[] rawData)
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            System.IO.Compression.GZipStream compressedzipStream = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Compress, true);
            compressedzipStream.Write(rawData, 0, rawData.Length);
            compressedzipStream.Close();
            return ms.ToArray();
        }


        /// <summary>
        /// 解压
        /// </summary>
        /// <param name="Value"></param>
        /// <returns></returns>
        public static DataSet GetDatasetByString(string Value)
        {
            DataSet ds = new DataSet();
            string CC = GZipDecompressString(Value);
            System.IO.StringReader Sr = new System.IO.StringReader(CC);
            ds.ReadXml(Sr);
            return ds;
        }


        /// <summary>
        /// 将传入的二进制字符串资料以GZip算法解压缩
        /// </summary>
        /// <param name="zippedString">经GZip压缩后的二进制字符串</param>
        /// <returns>原始未压缩字符串</returns>
        public static string GZipDecompressString(string zippedString)
        {
            if (string.IsNullOrEmpty(zippedString) || zippedString.Length == 0)
            {
                return "";
            }
            else
            {
                byte[] zippedData = Convert.FromBase64String(zippedString.ToString());
                return (string)(System.Text.Encoding.UTF8.GetString(Decompress(zippedData)));
            }
        }

        /// <summary>
        /// ZIP解压
        /// </summary>
        /// <param name="zippedData"></param>
        /// <returns></returns>
        public static byte[] Decompress(byte[] zippedData)
        {
            System.IO.MemoryStream ms = new System.IO.MemoryStream(zippedData);
            System.IO.Compression.GZipStream compressedzipStream = new System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Decompress);
            System.IO.MemoryStream outBuffer = new System.IO.MemoryStream();
            byte[] block = new byte[1024];
            while (true)
            {
                int bytesRead = compressedzipStream.Read(block, 0, block.Length);
                if (bytesRead <= 0)
                    break;
                else
                    outBuffer.Write(block, 0, bytesRead);
            }
            compressedzipStream.Close();
            return outBuffer.ToArray();

        }
        #endregion
    }

Updated @ 2019-29 

用ICSharpCode.SharpZipLib来压缩,经测试,可以提高约12%的压缩率,果断用之。算法网上有,这里就不贴了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值