• C#生成二维码,裁切边框


    使用google zxing生成的二维码带有白色边框,显示在报告(使用Crystal Report 水晶报表)上时,由于空间有限造成二维码过小难以扫描识别。

    通过将白色边框裁切掉,可以在有限的空间内最大化显示二维码。

    using com.google.zxing;
    using com.google.zxing.common;
    using com.google.zxing.qrcode.decoder;
    using java.awt.image;
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Sunway.Barcode
    {
        /// <summary>
        /// 
        /// </summary>
        public static class BarcodeHelper
        {
            /// <summary>
            /// 
            /// </summary>
            /// <param name="info"></param> 
            /// <returns></returns>
            public static string CreateBarcode(string info)
            {
                string filePath = string.Empty; 
                filePath = Guid.NewGuid().ToString() + ".png";
                //
                try
                {
                    MultiFormatWriter writer = new MultiFormatWriter(); 
                    Hashtable hints = new Hashtable();
                    hints.Add(EncodeHintType.CHARACTER_SET, "utf-8"); //编码 
                    ErrorCorrectionLevel level = ErrorCorrectionLevel.H;
                    hints.Add(EncodeHintType.ERROR_CORRECTION, level); //容错率 
                    //hints.Add(EncodeHintType.MARGIN, 0);  //二维码边框宽度,这里文档说设置0-4, 
                    ByteMatrix byteMatrix = writer.encode(info, BarcodeFormat.QR_CODE, 300, 300, hints);
                   
                    Bitmap bitmap = ToBitmap(byteMatrix);
                    //
                    bitmap.Save(filePath);
                }
                catch (Exception)
                { 
                    filePath = string.Empty;
                    throw;
                }
                finally
                {
    
                } 
                //
                return filePath;
            }
    
            /// <summary>
            /// 转换为位图
            /// </summary>
            /// <param name="matrix"></param>
            /// <returns></returns>
            public static Bitmap ToBitmap(ByteMatrix matrix)
            {
                int width = matrix.Width;
                int height = matrix.Height;
                //32位ARGB格式
                Bitmap bmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
                Color colorBlack = ColorTranslator.FromHtml("0xFF000000");//黑色
                Color colorWhite = ColorTranslator.FromHtml("0xFFFFFFFF");//白色
                                                                          // 二维矩阵转为一维像素数组,也就是一直横着排了  
                                                                          //Color[] pixels = new int[width * height];
                bool isFirstBlackPoint = false;
                int startX = 0;
                int startY = 0;
                //循环内容矩阵,写入白、黑点
                for (int x = 0; x < width; x++)
                {
                    for (int y = 0; y < height; y++)
                    {
                        if (matrix.get_Renamed(x, y) != -1)//返回白点/黑点
                        {
                            if (!isFirstBlackPoint)
                            {
                                isFirstBlackPoint = true;
                                startX = x;//二维码自带一个白色边框,边框内左上角是黑点,记录左上角的坐标点
                                startY = y;
                            }
                        }
                        bmap.SetPixel(x, y, matrix.get_Renamed(x, y) != -1 ? colorBlack : colorWhite); 
                    }
                }
    
                #region 判断并截取
                int PADDING_SIZE_MIN = 2;
                int x1 = startX - PADDING_SIZE_MIN;
                int y1 = startY - PADDING_SIZE_MIN;
                if (x1 < 0 || y1 < 0)
                {
                    return bmap;
                }
                else
                {
                    int w1 = width - x1 * 2;
                    int h1 = height - y1 * 2;
                    Bitmap bitmapQR = CutImage(bmap, new Rectangle(x1, y1, w1, h1));
                    return bitmapQR;
                }
                #endregion
            }
            
            /// <summary>
            /// 截取图片,指定截取区域(开始位置和长度/宽度)
            /// </summary>
            /// <param name="img"></param>
            /// <param name="rect"></param>
            /// <returns></returns>
            private static Bitmap CutImage(Image img, Rectangle rect)
            {
                Bitmap b = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb);
                Graphics g = Graphics.FromImage(b);
                g.DrawImage(img, 0, 0, rect, GraphicsUnit.Pixel);
                g.Dispose();
                return b;
            }
    
        }
    
    }
  • 相关阅读:
    plsql查询中文乱码
    ORA-12514: TNS:listener does not currently know of service requested in connect
    linux 手动配置ip地址方法
    开机自起tomcat
    (静默安装)Cent OS 6_5(x86_64)下安装Oracle 11g
    Linux下启动Oracle服务和监听程序
    linux下强制安装rpm包
    谷歌浏览器如何将整个网页保存为图片
    C语言移位和位运算
    MySQL连接的使用
  • 原文地址:https://www.cnblogs.com/mahongbiao/p/8732739.html
Copyright © 2020-2023  润新知