2016-05-31 153 views
1

如何创建自定义大小QR码图像QR码自定义大小

我使用https://qrcodenet.codeplex.com/生成QR码

我使用下面的函数生成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 

拨打电话如下:

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")) 

然后它生成的QR码如下:

enter image description here

的图像大小是非常小的(例如21 * 21)我想有一个更大的尺寸(自定义),例如300 * 300像素。

我试图覆盖Matrix.Width/Height,但它不起作用。有没有办法以自定义尺寸创建QR码?

+0

需要* you *逐个设置每个像素的工具看起来并不像它可能的那样有用。我会看看NuGet的一些替代品 – Plutonix

回答

3

如果您只想将QR码作为文件,则无需通过位图并自行设置每个像素。您正在使用的库支持写入流。

C#示例:

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

请注意,您还可以设置QuietZoneModules,并可以以你的QR码的边框。
请注意,我从System.Drawing.Color更改为System.Drawing.Brush
用法:

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

但是,如果你需要的位图对象出于某种原因,并想通过位图,并设置每个像素自己,这里是一个解决方案(虽然不是最优的):

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

用法是一样的原代码。

这里需要说明的一件事是,该代码要求生成的QrCode宽度和高度可以与输入size整除。如果你愿意,你可以添加代码来添加你自己的QuietZone。


编辑:正如plutonix指出的,位图也可以从流中生成。然后生成的方法如下所示:

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

对于一张图片,那么你不能保存到一个memstream,然后创建/返回位图? – Plutonix

+0

tx。按我的需要工作。 – user2739418

+0

最后一段代码(来自流)为我解决了它, 谢谢! –