前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C#生成二维码,裁切边框

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

作者头像
用户1637609
发布2018-04-12 15:21:38
1.6K0
发布2018-04-12 15:21:38
举报
文章被收录于专栏:马洪彪

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

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

代码语言:javascript
复制
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;
        }

    }

}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-04-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档