二维码中添加logo图片(提供下载)

        经过一段时间的研究,在原来没有添加logo图片的二维码中添加了logo图片。

        其实原理比较简单(添加logo图片),就是在生成的二维码中重新绘制一个图片上去就ok了。但是图片的大小是有限制的,在容错率较低的情况下,如果中间logo图片比较大会影响二维码的解析。一般在生成是使用高等级生成二维码。

        但是问题来了,那中间的logo是本地的图片还是网络图片呢,图片的大小如何设置呢。根据相关资料显示一般在logo图片的比例不超过整个二维码图片的1/3是不会影响二维码的解析的。

        好,现在通过一个函数对传入的图片进行压缩:

#region 图像缩放
        /// <summary>
        /// 缩放图片
        /// </summary>
        /// <param name="pPath">图片保存路径.jpg</param>
        /// <param name="imageWidth">目标图片宽度</param>
        private static Bitmap SetImageZoom(string pPath,int imageWidth)
        {
            //定义一个位图
            Bitmap partImg = null;
            //取得图片并缩放
            using (System.Drawing.Image originalImg = System.Drawing.Image.FromFile(pPath))
            {
                //原图和目标图片的宽度相同
                if (originalImg.Width == imageWidth && originalImg.Height == imageWidth)
                {
                    return (Bitmap)originalImg;
                }
                //原图和目标图片大小不同
                System.Drawing.Image.GetThumbnailImageAbort callback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
                //将原图片缩放到当前缩放的大小
                System.Drawing.Image zoomImg = originalImg.GetThumbnailImage(imageWidth, imageWidth, callback, IntPtr.Zero);
                partImg = new Bitmap(imageWidth, imageWidth);

                Graphics graphics = Graphics.FromImage(partImg);
                Rectangle destRect = new Rectangle(new Point(0, 0), new Size(imageWidth, imageWidth));//目标位置
                Rectangle origRect = new Rectangle(new Point(0, 0), new Size(imageWidth, imageWidth));//原图位置(默认从原图中截取的图片大小等于目标图片的大小)

                #region 文字水印
                ///文字水印  
                System.Drawing.Graphics G = System.Drawing.Graphics.FromImage(partImg);
                //System.Drawing.Font f = new Font("Lucida Grande", 6);
                //System.Drawing.Brush b = new SolidBrush(Color.Gray);
                G.Clear(Color.White);

                graphics.DrawImage(zoomImg, destRect, origRect, GraphicsUnit.Pixel);
                G.Dispose();
                #endregion

                originalImg.Dispose();
            }
            return partImg;
        }

        /// <summary>
        /// 缩放图片
        /// </summary>
        /// <param name="image">log图片</param>
        /// <param name="imageWidth">目标图片宽度,高度</param>
        private static Bitmap SetImageZoom(System.Drawing.Image image, int imageWidth)
        {
            //定义一个位图
            Bitmap partImg = null;
            //取得图片并缩放
            using (System.Drawing.Image originalImg = image)
            {
                //原图和目标图片的宽度相同
                if (originalImg.Width == imageWidth && originalImg.Height == imageWidth)
                {
                    return (Bitmap)originalImg;
                }
                //原图和目标图片大小不同
                System.Drawing.Image.GetThumbnailImageAbort callback = new System.Drawing.Image.GetThumbnailImageAbort(ThumbnailCallback);
                //将原图片缩放到当前缩放的大小
                System.Drawing.Image zoomImg = originalImg.GetThumbnailImage(imageWidth, imageWidth, callback, IntPtr.Zero);
                partImg = new Bitmap(imageWidth, imageWidth);

                Graphics graphics = Graphics.FromImage(partImg);
                Rectangle destRect = new Rectangle(new Point(0, 0), new Size(imageWidth, imageWidth));//目标位置
                Rectangle origRect = new Rectangle(new Point(0, 0), new Size(imageWidth, imageWidth));//原图位置(默认从原图中截取的图片大小等于目标图片的大小)

                #region 文字水印
                ///文字水印  
                System.Drawing.Graphics G = System.Drawing.Graphics.FromImage(partImg);
                //System.Drawing.Font f = new Font("Lucida Grande", 6);
                //System.Drawing.Brush b = new SolidBrush(Color.Gray);
                G.Clear(Color.White);

                graphics.DrawImage(zoomImg, destRect, origRect, GraphicsUnit.Pixel);
                G.Dispose();
                #endregion

                originalImg.Dispose();
            }
            return partImg;
        }

        /// <summary>
        /// 定义一个回调函数
        /// </summary>
        /// <returns></returns>
        private static bool ThumbnailCallback()
        {
            return false;
        }
        #endregion

           当然,这个函数比较粗糙,两个函数可以合并为一个而且有些代码是不必要的,有待优化。

           然后就是将中间的logo绘制到二维码上了哈:

#region 绘制中间log
        private Bitmap DrawCenterLogImage(Bitmap originalimage, Bitmap centerlogimage,int beginpoint)
        {

            //定义一个画板
            Graphics newG = Graphics.FromImage(originalimage);
            //定义一个坐标
            Point point = new Point(beginpoint, beginpoint);
            newG.DrawImage(centerlogimage, point);
            newG.Dispose();
            return originalimage;
        }
        #endregion

ok,以上就是对源码的修改了。

       接着我们测试能不能用呢?

       我们新建一个winform程序,这样很快就能够看到效果了。新建一个窗体,在窗体中拖放一个picturebox空间,命名pictureBox1.

      

        ok,我们看看效果如何:

        当然你可以扫一扫哦。扫出的信息就是hello world了哈。

        当然,你还可以设置其他的参数,图片的宽度,高度,前景色,背景色,容错等级,版本,这些都是可以设置的。

        你可以点击下载dll引用到你自己的项目中。同时你可以使用本地的图片作为logo,只是在调用的时候传递的是本地服务器的绝对路径。

#region 绘制有log缩略图的二维码
            String data = txtEncodeData.Text;
            //服务器图片路径
            string ImageURL = "../../Images/请叫我小白.png";
            //将相对路径转化为绝对路径
            ImageURL = System.IO.Path.GetFullPath(ImageURL);
            picEncode.Image = qrCodeEncoder.Encode(data, ImageURL, 1);
            //picEncode.Image = qrCodeEncoder.Encode(data, "http://avatar.csdn.net/4/C/8/1_tigertianx.jpg", 2);
            #endregion


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值