C# 输出条码二维码,自定义颜色、透明度 旋转角度

本文介绍了如何使用C#结合zxing.dll库,实现条码和二维码的生成,并详细讲解了如何设置条码和二维码的尺寸、颜色、透明度以及旋转角度,以达到理想的输出效果。

C# 调用 zxing.dll 生成条码二维码,自定义条码大小颜色透明度,旋转角度

输出效果

 

string txt = tNode.InnerText;
            if (txt.Equals("")) return;
            float x = 0, y = 0, x1 = 0, y1 = 0;
            if (tNode.Attributes["x"] != null)
                float.TryParse(tNode.Attributes["x"].Value, out x);
            if (tNode.Attributes["y"] != null)
                float.TryParse(tNode.Attributes["y"].Value, out y);
            if (tNode.Attributes["x1"] != null)
                float.TryParse(tNode.Attributes["x1"].Value, out x1);
            if (tNode.Attributes["y1"] != null)
                float.TryParse(tNode.Attributes["y1"].Value, out y1);

            float width = MmToPixel(x1 - x), height = MmToPixel(y1 - y);
            float angle = 0, alpha = 1;
            if (tNode.Attributes["Rotate"] != null)
                float.TryParse(tNode.Attributes["Rotate"].Value, out angle);

            if (tNode.Attributes["Alpha"] != null)
                float.TryParse(tNode.Attributes["Alpha"].Value, out alpha);

            string bcType = "";
            if (tNode.Attributes["Type"] != null)
                bcType = tNode.Attributes["Type"].Value;
            if (bcType.Equals("") && width == height) bcType = "QR_CODE";

            BarcodeFormat bcf = BarcodeFormat.CODE_128;
            foreach (var bn in Enum.GetValues(typeof(BarcodeFormat)))
            {
                if (bn.ToString().Equals(bcType, StringComparison.OrdinalIgnoreCase))
                    bcf = (BarcodeFormat)bn.GetHashCode();
            }

            var bcWriter = new BarcodeWriter();
            bcWriter.Format = bcf;
            if (bcWriter.Format == BarcodeFormat.QR_CODE)
            {
                QrCodeEncodingOptions opt2 = new QrCodeEncodingOptions();
                opt2.Width = (int)width;
                opt2.Height = (int)height;
                opt2.NoPadding = true;
                float qrv = 3;
                if (txt.Length > 42) qrv = 7;
                if (tNode.Attributes["QrVersion"] != null)
                    float.TryParse(tNode.Attributes["QrVersion"].Value, out qrv);
                opt2.QrVersion = (int)qrv;
                opt2.CharacterSet = "utf-8";
                string ecl = "H";
                if (tNode.Attributes["QrLevel"] != null)
                    ecl = tNode.Attributes["QrLevel"].Value.ToUpper().Trim();
                ZXing.QrCode.Internal.ErrorCorrectionLevel lvl = ZXing.QrCode.Internal.ErrorCorrectionLevel.H;
                switch (ecl)
                {
                    case "L":
                        lvl = ZXing.QrCode.Internal.ErrorCorrectionLevel.L;
                        break;
                    case "M":
                        lvl = ZXing.QrCode.Internal.ErrorCorrectionLevel.M;
                        break;
                    case "Q":
                        lvl = ZXing.QrCode.Internal.ErrorCorrectionLevel.Q;
                        break;
                }
                opt2.ErrorCorrection = lvl;
                bcWriter.Options = opt2;
            }
            else
            {
                EncodingOptions opt = new EncodingOptions();
                opt.Width = (int)width;
                opt.Height = (int)height;
                opt.NoPadding = true;
                if (tNode.Attributes["PureBarcode"] != null &&
                    (tNode.Attributes["PureBarcode"].Value.Equals("1") || tNode.Attributes["PureBarcode"].Value.Equals("true", StringComparison.OrdinalIgnoreCase)))
                    opt.PureBarcode = true;

                bcWriter.Options = opt;
            }
            var qrImg = bcWriter.Write(txt);

            ImageAttributes imgAttr = new ImageAttributes();
            // 设置透明度矩阵
            ColorMatrix cm = new ColorMatrix();
            cm.Matrix33 = alpha; // 设置透明度为50%
            imgAttr.SetColorMatrix(cm);

            List<ColorMap> cmList = new List<ColorMap>();
            //条码颜色
            if (tNode.Attributes["Color"] != null && 
                !String.IsNullOrEmpty(tNode.Attributes["Color"].Value))
            {
                Color color = ColorTranslator.FromHtml(tNode.Attributes["Color"].Value);
                cmList.Add(new ColorMap()
                {
                    OldColor = Color.Black,
                    NewColor = color
                });
            }

            //背景颜色
            if (tNode.Attributes["BgColor"] != null &&
                !String.IsNullOrEmpty(tNode.Attributes["BgColor"].Value))
            {
                Color color = ColorTranslator.FromHtml(tNode.Attributes["BgColor"].Value);
                cmList.Add(new ColorMap()
                {
                    OldColor = Color.White,
                    NewColor = color
                });
            }
            else
            {
                cmList.Add(new ColorMap()
                {
                    OldColor = Color.White,
                    NewColor = Color.Transparent
                });
            }
            imgAttr.SetRemapTable(cmList.ToArray());


            if (angle != 0)
            {
                g.TranslateTransform(MmToPixel(x) + width / 2, MmToPixel(y) + height / 2);
                g.RotateTransform(angle);

                Rectangle rf = new Rectangle((int)-width / 2, (int)-height / 2, (int)width, (int)height);
                g.DrawImage(qrImg, rf, 0, 0, qrImg.Width,qrImg.Height, GraphicsUnit.Pixel, imgAttr);
                g.ResetTransform();
            }
            else
            {
                Rectangle rf = new Rectangle(MmToPixel(x), MmToPixel(y), (int)width, (int)height);
                g.DrawImage(qrImg, rf, 0, 0, qrImg.Width, qrImg.Height, GraphicsUnit.Pixel, imgAttr);
            }
            qrImg.Dispose();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值