ZXing二维码生成

生成等比例logo切图方法


    /// <summary>
        /// 生成二维码
        /// </summary>
        /// <param name="fileName">生成二维码路径</param>
        /// <param name="url">生成的内容</param>
        /// <param name="width">二维码宽</param>
        /// <param name="height">二维码高</param>
        /// <param name="userFace">需生成的Logo图片</param>
        /// <returns></returns>
        private Bitmap GetCodeImgUrl(string fileName, string url, int width, int height, string userFace)
        {

            BarcodeWriter writer = new BarcodeWriter
            {
                Format = BarcodeFormat.QR_CODE,
                Renderer = new BitmapRenderer
                {
                    Foreground = Color.Black
                },
                Options = new ZXing.QrCode.QrCodeEncodingOptions
                {
                    DisableECI = true,
                    Height = height,
                    Width = width,
                    Margin = 0,
                    CharacterSet = "UTF-8",
                    ErrorCorrection = ErrorCorrectionLevel.M
                }
            };

            Bitmap bitmap = writer.Write(url);
            if (!string.IsNullOrEmpty(userFace))
            {
                Bitmap bits = (System.Drawing.Bitmap)System.Drawing.Image.FromFile(userFace);
                if (bits != null)
                {                    
                    //剪裁一个80*80的Logo图片
                    ImageCut img = new ImageCut(0, 0, 80, 80);
                    System.Drawing.Bitmap icon = img.KiCut(bits);
                    //userFace_b.jpg是一个边框的图片
                    Bitmap bits2 = new System.Drawing.Bitmap((System.Drawing.Bitmap)System.Drawing.Image.FromFile(Application.StartupPath + "/user/userFace_b.jpg"), 84, 84);
                    if (icon != null)
                    {
                        try
                        {  
                            //画了2个边框,一个是logo,一个在logo周围加了一个边框
                            using (var graphics = System.Drawing.Graphics.FromImage(bitmap))
                            {
                                graphics.DrawImage(bits2, (bitmap.Width - bits2.Width) / 2, (bitmap.Height - bits2.Height) / 2);
                                graphics.DrawImage(icon, (bitmap.Width - icon.Width) / 2, (bitmap.Height - icon.Height) / 2);

                            }

                        }
                        catch (Exception ex)
                        {

                        }
                        finally
                        {
                            icon.Dispose();
                            GC.Collect();

                        }
                    }
                    bitmap.Save(fileName, ImageFormat.Jpeg);
                }

            }

            return bitmap;
        }


裁剪类文件,是在开源社区找的一个剪裁类修改成的具体地址忘了,感谢作者。


  public class ImageCut
    {
        
        /// <summary>
        /// 剪裁 -- 用GDI+
        /// </summary>
        /// <param name="b">原始Bitmap</param>
        /// <param name="StartX">开始坐标X</param>
        /// <param name="StartY">开始坐标Y</param>
        /// <param name="iWidth">宽度</param>
        /// <param name="iHeight">高度</param>
        /// <returns>剪裁后的Bitmap</returns>
        public Bitmap KiCut(Bitmap b)
        {
            if (b == null)
            {
                return null;
            }
            int w = b.Width;
            int h = b.Height;
            int intWidth = 0;
            int intHeight = 0;
            if (h * Width / w > Height)
            {
                intWidth = Width;
                intHeight = h * Width / w;

            }
            else if (h * Width / w < Height)
            {
                intWidth = w * Height / h;
                intHeight = Height;
              
            }
            else
            {
                intWidth = Width;
                intHeight = Height;
            }

            Bitmap bmpOut_b = new System.Drawing.Bitmap(b, intWidth, intHeight);
            w = bmpOut_b.Width;
            h = bmpOut_b.Height;
           

            if (X >= w || Y >= h)
            {
                return null;
            }

            if (X + Width > w)
            {
                Width = w - X;
            }
            else
            {
                X = (w-Width) / 2;
            }

            if (Y + Height > h)
            {
                Height = h - Y;
            }
           



            try
            {
                Bitmap bmpOut = new Bitmap(Width, Height, PixelFormat.Format24bppRgb);             
                Graphics g = Graphics.FromImage(bmpOut);
                g.DrawImage(bmpOut_b, new Rectangle(0, 0, Width, Height), new Rectangle(X, Y, Width, Height), GraphicsUnit.Pixel);
                g.Dispose();

                return bmpOut;
            }
            catch
            {
                return null;
            }
        }

        public int X = 0;
        public int Y = 0;
        public int Width = 120;
        public int Height = 120;
        public ImageCut(int x, int y, int width, int heigth)
        {
            X = x;
            Y = y;
            Width = width;
            Height = heigth;
        }
    }


调用

 

  private void btnSubmit_Click(object sender, EventArgs e)
        {
            string UserId = "1245460396";    
         
            string curFilePath = "/user/";
       
            string curFileName_b = "DimensionalPig_" + UserId + "_b";
            string path = Application.StartupPath + curFilePath;
            if (Directory.Exists(path) == false)//如果不存在就创建file文件夹
            {
                Directory.CreateDirectory(path);
            }
            string fileName_b = Application.StartupPath + curFilePath + "/" + curFileName_b + ".jpg";//获得上传文件名

            string UserUrl = string.Format("http://www.csdn.net/u{0}", UserId.Trim());
            string userFace_b = Application.StartupPath + "/user/" + UserId + "_b.jpg";

            Bitmap bitmap_b = GetCodeImgUrl(fileName_b.Replace("_b.", "_b_ewm."), UserUrl, 400, 400, userFace_b);
            this.p.Image =(System.Drawing.Image)bitmap_b;
this.p.Image.Save(fileName_b.Replace("_b.", "_b_ewm."));


 

源码下载:http://download.csdn.net/detail/zhu885928/6587911

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值