백엔드 개발 C#.Net 튜토리얼 C#을 사용하여 로고가 있는 QR 코드를 생성하는 샘플 코드 공유

C#을 사용하여 로고가 있는 QR 코드를 생성하는 샘플 코드 공유

Mar 23, 2017 am 11:46 AM

로고가 포함된 QR 코드 생성은 두 단계로 나누어집니다. 먼저 입력 내용을 기반으로 QR 코드 이미지를 생성한 다음 로컬 로고 이미지를 읽고, 이미지 처리를 통해 로고가 포함된 QR 코드를 생성합니다. 이 글은 이를 소개하고 참고할만한 가치가 아주 좋습니다.

로고가 포함된 QR 코드를 생성하는 방법은 두 단계로 나누어집니다. 먼저, 기반으로 QR 코드 이미지를 생성합니다. 입력 내용을 입력한 후 로컬 로고 이미지를 읽고 이미지 처리를 통해 로고가 포함된 QR 코드를 생성합니다.

생성된 QR코드 효과는 다음과 같습니다.

아래에는 QR코드 생성 클래스인 QRCodeHelper.cs가 직접 게시되어 있고, CreateQRCodeWithLogo 메소드가 직접 호출됩니다. , 해당 매개변수는 비트맵 유형 데이터를 반환합니다. 반환된 데이터를 이미지 컨트롤에 직접 바인딩합니다. 웹인 경우 먼저 이미지를 지정된 주소에 저장할 수 있습니다.

/// <summary>
 /// 生成带logo二维码
 /// </summary>
 public class QRCodeHelper
 {/// <summary>
  /// 创建二维码
  /// </summary>
  /// <param name="content"></param>
  /// <param name="size"></param>
  /// <returns></returns>
  public static Bitmap Create(string content)
  {
   try
   {
    //var options = new QrCodeEncodingOptions
    //{
    // DisableECI = true,
    // CharacterSet = "UTF-8",
    // Width = size,
    // Height = size,
    // Margin = 0,
    // ErrorCorrection = ErrorCorrectionLevel.H
    //};
    //var writer = new BarcodeWriter();
    //writer.Format = BarcodeFormat.QR_CODE;
    //writer.Options = options;
    //var bmp = writer.Write(content);
    //return bmp;
    QRCodeEncoder qRCodeEncoder = new QRCodeEncoder();
    qRCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;//设置二维码编码格式 
    qRCodeEncoder.QRCodeScale = 4;//设置编码测量度    
    qRCodeEncoder.QRCodeVersion = 7;//设置编码版本 
    qRCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M;//设置错误校验 
    Bitmap image = qRCodeEncoder.Encode(content);
    return image;
   }
   catch (Exception ex)
   {
    return null;
   }
  }
  /// <summary>
  /// 获取本地图片
  /// </summary>
  /// <param name="fileName"></param>
  /// <returns></returns>
  private static Bitmap GetLocalLog(string fileName)
  {
   Bitmap newBmp = new Bitmap(fileName);
   //Bitmap bmp = new Bitmap(newBmp);
   return newBmp;
  }
  /// <summary>
  /// 生成带logo二维码
  /// </summary>
  /// <returns></returns>
  public static Bitmap CreateQRCodeWithLogo(string content, string logopath)
  {
   //生成二维码
   Bitmap qrcode = Create(content);
   //生成logo
   Bitmap logo = GetLocalLog(logopath);
   ImageUtility util = new ImageUtility();
   Bitmap finalImage = util.MergeQrImg(qrcode, logo);
   return finalImage;
  }
 }
로그인 후 복사

다음은 인터넷에 있는 이미지 처리 클래스입니다. ImageUtility.cs

public class ImageUtility
 {
  #region 合并用户QR图片和用户头像
  /// <summary>
  /// 合并用户QR图片和用户头像
  /// </summary>
  /// <param name="qrImg">QR图片</param>
  /// <param name="headerImg">用户头像</param>
  /// <param name="n"></param>
  /// <returns></returns>
  public Bitmap MergeQrImg(Bitmap qrImg, Bitmap headerImg, double n = 0.23)
  {
   int margin = 10;
   float dpix = qrImg.HorizontalResolution;
   float dpiy = qrImg.VerticalResolution;
   var _newWidth = (10 * qrImg.Width - 36 * margin) * 1.0f / 36;
   var _headerImg = ZoomPic(headerImg, _newWidth / headerImg.Width);
   //处理头像
   int newImgWidth = _headerImg.Width + margin;
   Bitmap headerBgImg = new Bitmap(newImgWidth, newImgWidth);
   headerBgImg.MakeTransparent();
   Graphics g = Graphics.FromImage(headerBgImg);
   g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
   g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
   g.Clear(Color.Transparent);
   Pen p = new Pen(new SolidBrush(Color.White));
   Rectangle rect = new Rectangle(0, 0, newImgWidth - 1, newImgWidth - 1);
   using (GraphicsPath path = CreateRoundedRectanglePath(rect, 1))
   {
    g.DrawPath(p, path);
    g.FillPath(new SolidBrush(Color.White), path);
   }
   //画头像
   Bitmap img1 = new Bitmap(_headerImg.Width, _headerImg.Width);
   Graphics g1 = Graphics.FromImage(img1);
   g1.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
   g1.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
   g1.Clear(Color.Transparent);
   Pen p1 = new Pen(new SolidBrush(Color.Gray));
   Rectangle rect1 = new Rectangle(0, 0, _headerImg.Width - 1, _headerImg.Width - 1);
   using (GraphicsPath path1 = CreateRoundedRectanglePath(rect1, 1))
   {
    g1.DrawPath(p1, path1);
    TextureBrush brush = new TextureBrush(_headerImg);
    g1.FillPath(brush, path1);
   }
   g1.Dispose();
   PointF center = new PointF((newImgWidth - _headerImg.Width) / 2, (newImgWidth - _headerImg.Height) / 2);
   g.DrawImage(img1, center.X, center.Y, _headerImg.Width, _headerImg.Height);
   g.Dispose();
   Bitmap backgroudImg = new Bitmap(qrImg.Width, qrImg.Height);
   backgroudImg.MakeTransparent();
   backgroudImg.SetResolution(dpix, dpiy);
   headerBgImg.SetResolution(dpix, dpiy);
   Graphics g2 = Graphics.FromImage(backgroudImg);
   g2.Clear(Color.Transparent);
   g2.DrawImage(qrImg, 0, 0);
   PointF center2 = new PointF((qrImg.Width - headerBgImg.Width) / 2, (qrImg.Height - headerBgImg.Height) / 2);
   g2.DrawImage(headerBgImg, center2);
   g2.Dispose();
   return backgroudImg;
  }
  #endregion
  #region 图形处理
  /// <summary>
  /// 创建圆角矩形
  /// </summary>
  /// <param name="rect">区域</param>
  /// <param name="cornerRadius">圆角角度</param>
  /// <returns></returns>
  private GraphicsPath CreateRoundedRectanglePath(Rectangle rect, int cornerRadius)
  {
   //下午重新整理下,圆角矩形
   GraphicsPath roundedRect = new GraphicsPath();
   roundedRect.AddArc(rect.X, rect.Y, cornerRadius * 2, cornerRadius * 2, 180, 90);
   roundedRect.AddLine(rect.X + cornerRadius, rect.Y, rect.Right - cornerRadius * 2, rect.Y);
   roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y, cornerRadius * 2, cornerRadius * 2, 270, 90);
   roundedRect.AddLine(rect.Right, rect.Y + cornerRadius * 2, rect.Right, rect.Y + rect.Height - cornerRadius * 2);
   roundedRect.AddArc(rect.X + rect.Width - cornerRadius * 2, rect.Y + rect.Height - cornerRadius * 2, 
   cornerRadius * 2, cornerRadius * 2, 0, 90);
   roundedRect.AddLine(rect.Right - cornerRadius * 2, rect.Bottom, rect.X + cornerRadius * 2, rect.Bottom);
   roundedRect.AddArc(rect.X, rect.Bottom - cornerRadius * 2, cornerRadius * 2, cornerRadius * 2, 90, 90);
   roundedRect.AddLine(rect.X, rect.Bottom - cornerRadius * 2, rect.X, rect.Y + cornerRadius * 2);
   roundedRect.CloseFigure();
   return roundedRect;
  }
  /// <summary>
  /// 图片按比例缩放
  /// </summary>
  private Image ZoomPic(Image initImage, double n)
  {
   //缩略图宽、高计算
   double newWidth = initImage.Width;
   double newHeight = initImage.Height;
   newWidth = n * initImage.Width;
   newHeight = n * initImage.Height;
   //生成新图
   //新建一个bmp图片
   System.Drawing.Image newImage = new System.Drawing.Bitmap((int)newWidth, (int)newHeight);
   //新建一个画板
   System.Drawing.Graphics newG = System.Drawing.Graphics.FromImage(newImage);
   //设置质量
   newG.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
   newG.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
   //置背景色
   newG.Clear(Color.Transparent);
   //画图
   newG.DrawImage(initImage, new System.Drawing.Rectangle(0, 0, newImage.Width, newImage.Height), 
   new System.Drawing.Rectangle(0, 0, initImage.Width, initImage.Height), System.Drawing.GraphicsUnit.Pixel);
   newG.Dispose();
   return newImage;
  }
  /// <summary>
  /// 创建缩略图
  /// </summary>
  /// <param name="b"></param>
  /// <param name="destHeight"></param>
  /// <param name="destWidth"></param>
  /// <returns></returns>
  public static Bitmap GetThumbnail(Bitmap b, int destHeight, int destWidth)
  {
   System.Drawing.Image imgSource = b;
   System.Drawing.Imaging.ImageFormat thisFormat = imgSource.RawFormat;
   int sW = 0, sH = 0;
   // 按比例缩放 
   int sWidth = imgSource.Width;
   int sHeight = imgSource.Height;
   if (sHeight > destHeight || sWidth > destWidth)
   {
    if ((sWidth * destHeight) > (sHeight * destWidth))
    {
     sW = destWidth;
     sH = (destWidth * sHeight) / sWidth;
    }
    else
    {
     sH = destHeight;
     sW = (sWidth * destHeight) / sHeight;
    }
   }
   else
   {
    sW = sWidth;
    sH = sHeight;
   }
   Bitmap outBmp = new Bitmap(destWidth, destHeight);
   Graphics g = Graphics.FromImage(outBmp);
   g.Clear(Color.Transparent);
   // 设置画布的描绘质量 
   g.CompositingQuality = CompositingQuality.HighQuality;
   g.SmoothingMode = SmoothingMode.HighQuality;
   g.InterpolationMode = InterpolationMode.HighQualityBicubic;
   g.DrawImage(imgSource, new Rectangle((destWidth - sW) / 2, (destHeight - sH) / 2, sW, sH), 0, 0, 
   imgSource.Width, imgSource.Height, GraphicsUnit.Pixel);
   g.Dispose();
   // 以下代码为保存图片时,设置压缩质量 
   EncoderParameters encoderParams = new EncoderParameters();
   long[] quality = new long[1];
   quality[0] = 100;
   EncoderParameter encoderParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, quality);
   encoderParams.Param[0] = encoderParam;
   imgSource.Dispose();
   return outBmp;
  }
  #endregion
 }
로그인 후 복사

위 내용은 C#을 사용하여 로고가 있는 QR 코드를 생성하는 샘플 코드 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

C#을 사용한 Active Directory C#을 사용한 Active Directory Sep 03, 2024 pm 03:33 PM

C#을 사용한 Active Directory 가이드. 여기에서는 소개와 구문 및 예제와 함께 C#에서 Active Directory가 작동하는 방식에 대해 설명합니다.

C#의 난수 생성기 C#의 난수 생성기 Sep 03, 2024 pm 03:34 PM

C#의 난수 생성기 가이드입니다. 여기서는 난수 생성기의 작동 방식, 의사 난수 및 보안 숫자의 개념에 대해 설명합니다.

C# 데이터 그리드 보기 C# 데이터 그리드 보기 Sep 03, 2024 pm 03:32 PM

C# 데이터 그리드 뷰 가이드. 여기서는 SQL 데이터베이스 또는 Excel 파일에서 데이터 그리드 보기를 로드하고 내보내는 방법에 대한 예를 설명합니다.

C#의 액세스 한정자 C#의 액세스 한정자 Sep 03, 2024 pm 03:24 PM

C#의 액세스 수정자에 대한 안내입니다. 예제 및 출력과 함께 C#의 액세스 한정자의 소개 유형에 대해 논의했습니다.

C# 직렬화 C# 직렬화 Sep 03, 2024 pm 03:30 PM

C# 직렬화 가이드. 여기에서는 C# 직렬화 개체의 소개, 단계, 작업 및 예제를 각각 논의합니다.

C#의 패턴 C#의 패턴 Sep 03, 2024 pm 03:33 PM

C#의 패턴 가이드. 여기에서는 예제 및 코드 구현과 함께 C#의 패턴 소개 및 상위 3가지 유형에 대해 설명합니다.

C#의 소수 C#의 소수 Sep 03, 2024 pm 03:35 PM

C#의 소수 가이드. 여기서는 코드 구현과 함께 C#의 소수에 대한 소개와 예를 논의합니다.

C#의 팩토리얼 C#의 팩토리얼 Sep 03, 2024 pm 03:34 PM

C#의 팩토리얼 가이드입니다. 여기서는 다양한 예제 및 코드 구현과 함께 C#의 계승에 대한 소개를 논의합니다.

See all articles