2015-06-25 30 views
7

Io uso ZXing.Net libreria per generare un'immagine di un codice QR -Aggiungi immagine personalizzata o un testo per il codice QR generato da ZXing.Net

app screenshot

Nella parte superiore della mia classe:

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

Il mio metodo:

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

Si prega di avvisare come aggiungere una stringa di testo breve o un custo m immagine al centro del codice QR - simile al Wikipedia visual QR code di seguito:

Wikipedia

UPDATE:

Incorporare logo personalizzato nel codice QR sembra non essere (senza rompere la seconda!) un compito banale come la pubblicazione scientifica QR Images: Optimized Image Embedding in QR Codes mostra ...

Ma mi chiedo ancora se potrei generare un codice QR (come nel codice sorgente sopra), quindi sovrapporlo con un testo o un logo personalizzato, quindi convalidare il risultato immagine di nuovo da ZXing .Netto.

+1

non so le librerie, ma questo non è un testo, questa è un'immagine, si dovrebbe guardare in questa direzione –

+0

Sì, certo la finale l'output è un'immagine - ma seguo qualsiasi metodo nella libreria ZXing per aggiungere testo o immagini personalizzati all'interno del QR generato. Inoltre, non posso semplicemente mettere la mia immagine sopra al QR e sperare che sia ancora leggibile grazie alla correzione degli errori (come suggeriscono alcuni blog) - perché il mio QR è generato dinamicamente e contiene un indirizzo Bluetooth (variabile) + altre cose. –

+0

Quello che intendevo è che non c'è alcun metodo per aggiungere del testo, c'è solo un metodo per aggiungere un'immagine nel tuo qrcode, come wikipedia mettere il logo wikipedia e non il testo 'wikipedia' –

risposta

8

Qui andiamo (è possibile utilizzare qualsiasi 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; 
    } 

} 

Il risultato:

enter image description here

E l'output:

Vero

+0

È un grande codice, grazie (+1) ma manca la convalida della bitmap risultante ... (cioè se 'bm' è ancora un codice QR valido) –

+0

Non restituire result.Text == url' genera un'eccezione se la decodifica fallisce (I am C# novizio)? Non dovrebbe essere meglio scritto come 'return result! = Null && result.Text == url'? –

+1

Ho trovato il bug e l'ho corretto (vedi l'ultima modifica), ma hai ragione @AlexanderFarber –

2

Poiché si ottiene una bitmap da ZXing, è possibile utilizzare le tecniche C# per disegnare il testo. Vedere questa risposta per maggiori informazioni:

c# write text on bitmap

Ai posteri ecco qualche codice spudoratamente copiato:

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();