专栏首页马洪彪C#生成二维码,裁切边框

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;
        }

    }

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C#解析PDF

    C#解析PDF的方式有很多,比较好用的有ITestSharp和PdfBox。 PDF内容页如果是图片类型,例如扫描件,则需要进行OCR(光学字符识别)。 文本内...

    用户1637609
  • Fortify Audit Workbench 笔记 Privacy Violation 隐私泄露

    对各种机密信息处理不当,如客户密码或社会保障号码,会危及到用户的个人隐私,这是一种非法行为。

    用户1637609
  • Java ORM Hibernate 入门笔记

    一、下载 官网地址:http://hibernate.org/ Hibernate下有ORM(关系型数据库)、OGM(NoSQL数据库)、Search(对象全文...

    用户1637609
  • .Net之Nopi Excel数据导出和批量导入功能

      它是一个专门用于读写Microsoft Office二进制和OOXML文件格式的.NET库,我们使用它能够轻松的实现对应数据的导入,导出功能,并且还能通过其...

    追逐时光
  • 蓝桥杯vip测试题系统试题-算法提高 矩阵转置

    给定一个n×m矩阵相乘,求它的转置。其中1≤n≤20,1≤m≤20,矩阵中的每个元素都在整数类型(4字节)的表示范围内。

    TrueDei
  • 程序员面试金典 - 面试题 05.08. 绘制直线(位运算)

    绘制直线。有个单色屏幕存储在一个一维数组中,使得32个连续像素可以存放在一个 int 里。 屏幕宽度为w,且w可被32整除(即一个 int 不会分布在两行上)...

    Michael阿明
  • 【CodeForces 625C】K-special Tables

    第k列前的格子1 2 .. 按要求填到满格,然后第k列及后面的格子,都从左到右填递增1的数。

    饶文津
  • 【CodeForces 261B】Maxim and Restaurant(DP,期望)

    第一种解法是O(n^3*p)的:f[i][j][k]表示前i个人进j个人长度为k有几种方案(排列固定为123..n时)。f[i][j][k]=f[i-1][j]...

    饶文津
  • LWC 66: 760. Find Anagram Mappings

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.n...

    用户1147447
  • [LeetCode] 137. Single Number II

    【原题】 Given an array of integers, every element appears three times except for...

    用户1148830

扫码关注云+社区

领取腾讯云代金券