using System;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Net;
using System.Web;
namespace QRCodes
{
public static class QRCode
{
private static readonly WebClient m_WebClient = new WebClient();
private const string m_GoogleApiUrl = "http:
private const int m_GuidCodeSize = 31;
private static int m_DefaultSize = 80;
private static int m_DefaultMargin = 0;
private static int m_DefaultGuidScale = 2;
private static int m_DefaultManyMargin = 5;
private static ErrorCorrectionLevel m_DefaultErrorCorrection = ErrorCorrectionLevel.Low;
public static int DefaultManyMargin
{
get { return m_DefaultManyMargin; }
set { m_DefaultManyMargin = value; }
}
public static int DefaultGuidScale
{
get { return m_DefaultGuidScale; }
set { m_DefaultGuidScale = value; }
}
public static int DefaultSize
{
get { return m_DefaultSize; }
set { m_DefaultSize = value; }
}
public static int DefaultMargin
{
get { return m_DefaultMargin; }
set { m_DefaultMargin = value; }
}
public static ErrorCorrectionLevel DefaultErrorCorrection
{
get { return m_DefaultErrorCorrection; }
set { m_DefaultErrorCorrection = value; }
}
public static Image Generate(Guid data)
{
if (data == null) throw new ArgumentNullException("data");
return Generate(data, m_DefaultGuidScale);
}
public static Image Generate(Guid data, int scale)
{
if (data == null) throw new ArgumentNullException("data");
if (scale < 1) throw new ArgumentOutOfRangeException("scale", scale, "Must be greater than zero.");
return Generate(data.ToString("N"), m_GuidCodeSize * scale, 1, ErrorCorrectionLevel.Medium);
}
public static Image GenerateMany(Guid[,] data)
{
if (data == null) throw new ArgumentNullException("data");
return GenerateMany(data, m_DefaultManyMargin, m_DefaultGuidScale);
}
public static Image GenerateMany(Guid[,] data, int manyMargin, int scale)
{
if (data == null) throw new ArgumentNullException("data");
if (manyMargin < 0) throw new ArgumentOutOfRangeException("manyMargin", manyMargin, "Must be greater than or equal to zero.");
if (scale < 1) throw new ArgumentOutOfRangeException("scale", scale, "Must be greater than zero.");
var countX = data.GetLength(0);
var countY = data.GetLength(1);
var img = new Bitmap(m_GuidCodeSize * scale * countX + manyMargin * (countX + 1), m_GuidCodeSize * scale * countY + manyMargin * (countY + 1));
using (var g = Graphics.FromImage(img))
{
g.Clear(Color.White);
for (int x = 0; x < countX; x++)
{
for (int y = 0; y < countY; y++)
{
using (var qr = QRCode.Generate(data[x, y], scale))
{
var loc = new Point(x * qr.Width + manyMargin * x + manyMargin, y * qr.Height + manyMargin * y + manyMargin);
g.DrawImage(qr, loc);
g.DrawRectangle(Pens.Black, new Rectangle(new Point(loc.X - 1, loc.Y - 1), new Size(qr.Width + 1, qr.Height + 1)));
}
}
}
}
return img;
}
public static Image Generate(string data)
{
if (data == null) throw new ArgumentNullException("data");
return Generate(data, m_DefaultSize, m_DefaultMargin, m_DefaultErrorCorrection);
}
public static Image Generate(string data, int size, int margin, ErrorCorrectionLevel errorCorrection)
{
if (data == null) throw new ArgumentNullException("data");
if (size < 1) throw new ArgumentOutOfRangeException("size", size, "Must be greater than zero.");
if (margin < 0) throw new ArgumentOutOfRangeException("margin", margin, "Must be greater than or equal to zero.");
if (!Enum.IsDefined(typeof(ErrorCorrectionLevel), errorCorrection)) throw new InvalidEnumArgumentException("errorCorrectionLevel", (int)errorCorrection, typeof(ErrorCorrectionLevel));
var link = string.Format(m_GoogleApiUrl, size, HttpUtility.UrlEncode(data), errorCorrection.ToString()[0], margin);
using (var ms = new MemoryStream(m_WebClient.DownloadData(link)))
{
return Image.FromStream(ms);
}
}
public static Image GenerateMany(string[,] data)
{
if (data == null) throw new ArgumentNullException("data");
return GenerateMany(data, m_DefaultSize, m_DefaultManyMargin, m_DefaultMargin, m_DefaultErrorCorrection);
}
public static Image GenerateMany(string[,] data, int size, int manyMargin, int margin, ErrorCorrectionLevel errorCorrection)
{
if (data == null) throw new ArgumentNullException("data");
if (size < 1) throw new ArgumentOutOfRangeException("size", size, "Must be greater than zero.");
if (margin < 0) throw new ArgumentOutOfRangeException("margin", margin, "Must be greater than or equal to zero.");
if (manyMargin < 0) throw new ArgumentOutOfRangeException("manyMargin", manyMargin, "Must be greater than or equal to zero.");
if (!Enum.IsDefined(typeof(ErrorCorrectionLevel), errorCorrection)) throw new InvalidEnumArgumentException("errorCorrectionLevel", (int)errorCorrection, typeof(ErrorCorrectionLevel));
var countX = data.GetLength(0);
var countY = data.GetLength(1);
var img = new Bitmap(size * countX + manyMargin * (countX + 1), size * countY + manyMargin * (countY + 1));
using (var g = Graphics.FromImage(img))
{
g.Clear(Color.White);
for (int x = 0; x < countX; x++)
{
for (int y = 0; y < countY; y++)
{
using (var qr = QRCode.Generate(data[x, y], size, margin, errorCorrection))
{
var loc = new Point(x * qr.Width + manyMargin * x + manyMargin, y * qr.Height + manyMargin * y + manyMargin);
g.DrawImage(qr, loc);
g.DrawRectangle(Pens.Black, new Rectangle(loc, new Size(qr.Width - 1, qr.Height - 1)));
}
}
}
}
return img;
}
}
public enum ErrorCorrectionLevel
{
Low = 0,
Medium,
QuiteGood,
High
}
}
|