2015-06-25 2 views
7

Ich benutze ZXing.Net Bibliothek einen QR-Code-Bild zu erzeugen -zu QR-Code generiert durch ZXing.Net

app screenshot

An der Spitze meiner Klasse:

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

Meine Methode:

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

Bitte beraten Sie mich, wie Sie kurze Zeichenfolge oder ein custo hinzufügen m Bild in der Mitte des QR-Codes - ähnlich die Wikipedia visual QR code unter:

Wikipedia

UPDATE:

Embedding individuellem Logo in QR Code scheint nicht zu sein (ohne diesen zu brechen!) eine triviale aufgabe wie die wissenschaftliche veröffentlichung QR Images: Optimized Image Embedding in QR Codes zeigt ...

Aber ich frage mich immer noch, ob ich einen QR-Code generieren könnte (wie im obigen Quellcode), dann überlagere es mit einem benutzerdefinierten Text oder Logo und validiere das Ergebnis Bild wieder von ZXing .Netz.

+1

ich weiß nicht, die Libs, aber dies ist nicht Text, dies ist ein Bild, sollten Sie in dieser Richtung schauen –

+0

Ja, sicher, das Finale Ausgabe ist ein Bild - aber ich bin nach irgendwelchen Methoden in der ZXing-Bibliothek, um benutzerdefinierten Text oder Bilder innerhalb der generierten QR hinzuzufügen. Außerdem kann ich nicht einfach mein Bild auf den QR setzen und hoffe dann, dass es dank der Fehlerkorrektur lesbar ist (wie einige Blogs vorschlagen) - weil mein QR dynamisch generiert wird und (variable) Bluetooth-Adresse + mehr Zeug enthält. –

+0

Was ich meinte ist, dass es keine Methode gibt, um Text hinzuzufügen, gibt es nur eine Methode, Bild in Ihrem QRCode hinzuzufügen, wie Wikipedia das Wikipedia-Logo und nicht den Text 'wikipedia' setzen –

Antwort

8

Hier gehen wir (Sie ein Logo verwenden):

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

} 

Die Ergebnis:

enter image description here

Und die Ausgabe:

Wahre

+0

Es ist toller Code, danke (+1) aber es fehlt die Validierung der resultierenden Bitmap ... (dh wenn 'bm' immer noch ein gültiger QR-Code ist) –

+0

Würde' result.Text == url' nicht zurückgeben, würde eine Ausnahme fehlschlagen, wenn die Decodierung fehlschlägt (Ich bin C# Neuling)? Sollte es nicht besser geschrieben werden als 'return result! = Null && result.Text == url'? –

+1

Ich habe diesen Fehler gefunden und korrigiert (siehe letzte Änderung), aber Sie haben Recht @AlexanderFarber –

2

Da Sie eine Bitmap aus ZXing erhalten, können Sie Standard-C# -Techniken verwenden, um Text zu zeichnen. Sehen Sie diese Antwort für weitere Informationen:

c# write text on bitmap

Für die Nachwelt hier einige schamlos kopierten Code:

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