2015-06-25 15 views
7

tôi sử dụng ZXing.Net thư viện để tạo ra một hình ảnh mã QR -Thêm hình ảnh tùy chỉnh hoặc văn bản để mã QR được tạo ra bởi ZXing.Net

app screenshot

Ở phía trên cùng của lớp học của tôi:

[System.Runtime.InteropServices.DllImport("gdi32.dll")] 
    public static extern bool DeleteObject(IntPtr hObject); 

Phương pháp của tôi:

protected void UpdateQRSource(String address) 
    { 
     QRCodeWriter qrcode = new QRCodeWriter(); 
     BarcodeWriter barcodeWriter = new BarcodeWriter 
     { 
      Format = BarcodeFormat.QR_CODE, 
      Options = new EncodingOptions 
      { 
       Width = 300, 
       Height = 300, 
       Margin = 4 
      } 
     }; 

     using (Bitmap bitmap = barcodeWriter.Write(address)) 
     { 
      IntPtr hbmp = bitmap.GetHbitmap(); 
      try 
      { 
       BitmapSource source = Imaging.CreateBitmapSourceFromHBitmap(
        hbmp, 
        IntPtr.Zero, 
        Int32Rect.Empty, 
        BitmapSizeOptions.FromEmptyOptions()); 
       qrImage.Source = source; // set WPF image source 
      } 
      finally 
      { 
       DeleteObject(hbmp); 
      } 
     } 
    } 

Vui lòng tư vấn cho tôi cách thêm chuỗi văn bản ngắn hoặc lệnh lưu giữ hình ảnh m ở giữa của mã QR - tương tự như Wikipedia visual QR code dưới đây:

Wikipedia

UPDATE:

Nhúng biểu tượng tùy chỉnh trong mã QR có vẻ là không (mà không vi phạm sau này!) một tác vụ tầm thường như ấn phẩm khoa học QR Images: Optimized Image Embedding in QR Codes cho thấy ...

Nhưng tôi vẫn tự hỏi liệu tôi có thể tạo mã QR (như trong mã nguồn ở trên) hay không, sau đó phủ nó bằng văn bản hoặc biểu tượng tùy chỉnh hình ảnh một lần nữa bởi ZXing .Mạng lưới.

+1

Tôi không biết libs nhưng đây không phải là văn bản, đây là một hình ảnh, bạn nên xem xét theo hướng này –

+0

Vâng, chắc chắn trận chung kết đầu ra là một hình ảnh - nhưng tôi sau bất kỳ phương pháp nào trong thư viện ZXing để thêm văn bản hoặc hình ảnh tùy chỉnh bên trong QR được tạo. Ngoài ra, tôi không thể chỉ đặt hình ảnh lên trên QR và sau đó hy vọng nó vẫn có thể đọc được nhờ sửa lỗi (như một số blog đề xuất) - vì QR của tôi được tạo động và chứa (biến) địa chỉ Bluetooth + nhiều thứ khác. –

+0

Những gì tôi có nghĩa là không có phương pháp để thêm văn bản, chỉ có một phương pháp để thêm hình ảnh trong qrcode của bạn, như wikipedia đặt logo wikipedia và không phải là văn bản 'wikipedia' –

Trả lời

8

Ở đây chúng ta đi (bạn có thể sử dụng bất kỳ logo):

using System.Collections.Generic; 
using System.Drawing; 
using System.Windows.Forms; 
using ZXing; 
using ZXing.QrCode.Internal; 
using ZXing.Rendering; 


namespace Test 
{ 
    public partial class Form1 : Form 
{ 

    private string imagePath = @"YourPath"; 
    private string url = @"https://en.WIKIPEDIA.ORG/"; 
    private int size = 400; 
    public Form1() 
    { 
     InitializeComponent(); 

     pictureBox1.Image = GenerateQR(size, size, url); 
     pictureBox1.Height = size; 
     pictureBox1.Width = size; 
     Console.WriteLine(checkQR(new Bitmap(pictureBox1.Image))); 
    } 

    public bool checkQR(Bitmap QrCode) 
    { 
     var reader = new BarcodeReader(); 
     var result = reader.Decode(QrCode); 
     if (result == null) 
      return false; 
     return result.Text == url; 
    } 


    public Bitmap GenerateQR(int width, int height, string text) 
    { 
     var bw = new ZXing.BarcodeWriter(); 

     var encOptions = new ZXing.Common.EncodingOptions 
     { 
      Width = width, 
      Height = height, 
      Margin = 0, 
      PureBarcode = false 
     }; 

     encOptions.Hints.Add(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); 

     bw.Renderer = new BitmapRenderer(); 
     bw.Options = encOptions; 
     bw.Format = ZXing.BarcodeFormat.QR_CODE; 
     Bitmap bm = bw.Write(text); 
     Bitmap overlay = new Bitmap(imagePath); 

     int deltaHeigth = bm.Height - overlay.Height; 
     int deltaWidth = bm.Width - overlay.Width; 

     Graphics g = Graphics.FromImage(bm); 
     g.DrawImage(overlay, new Point(deltaWidth/2,deltaHeigth/2)); 

     return bm; 
    } 

} 

Các kết quả:

enter image description here

Và kết quả:

Đúng

+0

Đó là mã tuyệt vời, cảm ơn (+1) nhưng thiếu xác nhận của bitmap kết quả ... (ví dụ: nếu 'bm' vẫn là mã QR hợp lệ) –

+0

Sẽ không' trả về kết quả.Text == url' ném ngoại lệ nếu giải mã không thành công (tôi là C# newbie)? Không nên viết nó là 'return result! = Null && result.Text == url'? –

+1

Tôi thấy rằng lỗi và sửa chữa nó (xem chỉnh sửa cuối cùng), nhưng bạn phải @AlexanderFarber –

2

Vì bạn lấy bitmap ra khỏi ZXing, bạn có thể sử dụng các kỹ thuật C# tiêu chuẩn để vẽ văn bản. Xem câu trả lời này cho biết thêm:

c# write text on bitmap

Đối với hậu thế đây là một số mã không biết xấu hổ sao chép:

Bitmap bmp = //from ZXing; 

RectangleF rectf = new RectangleF(70, 90, 90, 50); 

Graphics g = Graphics.FromImage(bmp); 

g.SmoothingMode = SmoothingMode.AntiAlias; 
g.InterpolationMode = InterpolationMode.HighQualityBicubic; 
g.PixelOffsetMode = PixelOffsetMode.HighQuality; 
g.DrawString("yourText", new Font("Tahoma",8), Brushes.Black, rectf); 

g.Flush(); 
Các vấn đề liên quan