2016-05-31 152 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

最後一段代碼(來自流)爲我解決了它, 謝謝! –