2016-05-31 2 views
1

Comment créer un format personnalisé l'image QR-CodeQR-Code taille personnalisée

J'utilise https://qrcodenet.codeplex.com/ pour générer des codes QR

J'utilise la fonction suivante pour générer du code qr

Public Function GenerateQRCode(URL As String, DarkColor As System.Drawing.Color, LightColor As System.Drawing.Color) As Bitmap 
    Dim Encoder As New Gma.QrCodeNet.Encoding.QrEncoder(Gma.QrCodeNet.Encoding.ErrorCorrectionLevel.L) 
    Dim Code As Gma.QrCodeNet.Encoding.QrCode = Encoder.Encode(URL) 
    Dim TempBMP As New Bitmap(Code.Matrix.Width, Code.Matrix.Height) 
    For X As Integer = 0 To Code.Matrix.Width - 1 
     For Y As Integer = 0 To Code.Matrix.Height - 1 
      If Code.Matrix.InternalArray(X, Y) Then TempBMP.SetPixel(X, Y, DarkColor) Else TempBMP.SetPixel(X, Y, LightColor) 
     Next 
    Next 
    Return TempBMP 
End Function 

Pour faire un appel comme ci-dessous:

Dim obj As New QRGenerator() 
     Dim img = obj.GenerateQRCode("www.google.co.uk", Drawing.Color.Black, Drawing.Color.Aqua) 
     img.Save(Context.Server.MapPath("images/stars_5.png")) 

Et puis il génère le code QR ci-dessous:

enter image description here

La taille de l'image est très faible (par exemple 21 * 21) J'aimerais avoir une plus grande taille (personnalisée), par ex. 300 * 300 pixels.

J'ai essayé de remplacer la largeur/hauteur de la matrice, mais cela ne fonctionne pas. Y at-il un moyen de créer du code QR en taille personnalisée?

+0

Un outil qui nécessite * vous * pour régler chaque pixel un à un ne semble pas être aussi utile qu'il pourrait l'être. Je regarderais certaines des alternatives sur NuGet – Plutonix

Répondre

3

Si vous ne voulez que le code QR en tant que fichier, il n'est pas nécessaire de parcourir un bitmap et de définir chaque pixel par vous-même. La bibliothèque que vous utilisez prend en charge l'écriture dans le flux.

C# exemple:

public static void WriteQrToFile(string url, Brush darkColor, Brush lightColor, int size, string filePath) { 
    var encoder = new QrEncoder(ErrorCorrectionLevel.L); 
    var code = encoder.Encode(url); 
    var renderer = new GraphicsRenderer(new FixedCodeSize(size, QuietZoneModules.Zero), darkColor, lightColor); 
    using (var fs = new FileStream(filePath, FileMode.Create)) 
     renderer.WriteToStream(code.Matrix, ImageFormat.Png, fs); 
} 

Notez que vous pouvez également définir les QuietZoneModules, pour permettre une bordure autour de votre code QR. Notez aussi que j'ai changé de System.Drawing.Color à System.Drawing.Brush.
Utilisation:

var filePath = Context.Server.MapPath("images/stars_5.png"); 
WriteQrToFile("www.google.co.uk", Brushes.Black, Brushes.Aqua, 300, filePath); 

Cependant, si vous avez besoin de l'objet Bitmap pour une raison quelconque, et que vous voulez passer par le Bitmap et définir chaque pixel vous, voici une solution (mais pas optimale):

code C#:

public static Bitmap GenerateQrCode(string url, System.Drawing.Color darkColor, System.Drawing.Color lightColor, int size) { 
    var encoder = new QrEncoder(ErrorCorrectionLevel.L); 
    var code = encoder.Encode(url); 
    if (size % code.Matrix.Width != 0 || size % code.Matrix.Height != 0) 
     throw new InvalidOperationException("Width/Height not divisible with size"); 
    var multiplier = size/code.Matrix.Width; 
    var tempBmp = new Bitmap(size, size); 
    for (int x = 0; x < size; x++) { 
     for (int y = 0; y < size; y++) { 
      var originalX = x/multiplier; 
      var originalY = y/multiplier; 
      if (code.Matrix.InternalArray[originalX, originalY]) 
       tempBmp.SetPixel(x, y, darkColor); 
      else 
       tempBmp.SetPixel(x, y, lightColor); 
     } 
    } 
    return tempBmp; 
} 

Utilisation serait le même que dans votre code d'origine.

Une chose à noter ici, c'est que ce code nécessite la QrCode-largeur et la hauteur à être divisible avec l'entrée size. Vous pouvez ajouter du code pour ajouter votre propre QuietZone, si vous le souhaitez. Edit: Comme plutonix l'a souligné, le bitmap peut également être généré à partir d'un flux. La méthode résultante ressemblerait alors à ceci:

public static Bitmap GenerateQrCode(string url, Brush darkColor, Brush lightColor, int size) { 
    var encoder = new QrEncoder(ErrorCorrectionLevel.L); 
    var code = encoder.Encode(url); 
    var renderer = new GraphicsRenderer(new FixedCodeSize(size, QuietZoneModules.Zero), darkColor, lightColor); 
    using (var ms = new MemoryStream()) { 
     renderer.WriteToStream(code.Matrix, ImageFormat.Png, ms); 
     return new Bitmap(ms); 
    } 
} 
+1

Pour une image alors, ne pourriez-vous pas enregistrer dans un memstream et puis créer/retourner le bitmap de cela? – Plutonix

+0

tx. J'ai travaillé comme j'ai besoin. – user2739418

+0

le dernier morceau de code (du flux) l'a résolu pour moi, Merci! –