请教一下VFP 怎么定义Zxing.dll?
网上找了段VB的,但ZXING.DLL的方法是多层的(ZXing.QrCode.QRCodeWriter),不知道怎么定义和调用,请各位大大指点一下,谢谢~
程序代码:public sealed class QRCodeWriter : Writer
{
private const int QUIET_ZONE_SIZE = 4;
/// <summary>
/// Encode a barcode using the default settings.
/// </summary>
/// <param name="contents">The contents to encode in the barcode</param>
/// <param name="format">The barcode format to generate</param>
/// <param name="width">The preferred width in pixels</param>
/// <param name="height">The preferred height in pixels</param>
/// <returns>
/// The generated barcode as a Matrix of unsigned bytes (0 == black, 255 == white)
/// </returns>
public BitMatrix encode(string contents, BarcodeFormat format, int width, int height)
{
return encode(contents, format, width, height, null);
}
/// <summary>
/// </summary>
/// <param name="contents">The contents to encode in the barcode</param>
/// <param name="format">The barcode format to generate</param>
/// <param name="width">The preferred width in pixels</param>
/// <param name="height">The preferred height in pixels</param>
/// <param name="hints">Additional parameters to supply to the encoder</param>
/// <returns>
/// The generated barcode as a Matrix of unsigned bytes (0 == black, 255 == white)
/// </returns>
public BitMatrix encode(string contents, BarcodeFormat format, int width, int height, IDictionary<EncodeHintType, object> hints)
{
if (string.IsNullOrEmpty(contents))
{
throw new ArgumentException("Found empty contents");
}
if (format != BarcodeFormat.QR_CODE)
{
throw new ArgumentException("Can only encode QR_CODE, but got " + format);
}
if (width < 0 || height < 0)
{
throw new ArgumentException("Requested dimensions are too small: " + width + "x" + height);
}
ErrorCorrectionLevel errorCorrectionLevel = ErrorCorrectionLevel.L;
int quietZone = 4;
if (hints != null)
{
if (hints.ContainsKey(EncodeHintType.ERROR_CORRECTION))
{
object requestedECLevel = hints[EncodeHintType.ERROR_CORRECTION];
if (requestedECLevel != null)
{
errorCorrectionLevel = (requestedECLevel as ErrorCorrectionLevel);
if (errorCorrectionLevel == null)
{
switch (requestedECLevel.ToString().ToUpper())
{
case "L":
errorCorrectionLevel = ErrorCorrectionLevel.L;
break;
case "M":
errorCorrectionLevel = ErrorCorrectionLevel.M;
break;
case "Q":
errorCorrectionLevel = ErrorCorrectionLevel.Q;
break;
case "H":
errorCorrectionLevel = ErrorCorrectionLevel.H;
break;
default:
errorCorrectionLevel = ErrorCorrectionLevel.L;
break;
}
}
}
}
if (hints.ContainsKey(EncodeHintType.MARGIN))
{
object quietZoneInt = hints[EncodeHintType.MARGIN];
if (quietZoneInt != null)
{
quietZone = Convert.ToInt32(quietZoneInt.ToString());
}
}
}
return renderResult(Encoder.encode(contents, errorCorrectionLevel, hints), width, height, quietZone);
}
private static BitMatrix renderResult(QRCode code, int width, int height, int quietZone)
{
ByteMatrix input = code.Matrix;
if (input == null)
{
throw new InvalidOperationException();
}
int inputWidth = input.Width;
int inputHeight = input.Height;
int qrWidth = inputWidth + (quietZone << 1);
int qrHeight = inputHeight + (quietZone << 1);
int outputWidth = Math.Max(width, qrWidth);
int outputHeight = Math.Max(height, qrHeight);
int multiple = Math.Min(outputWidth / qrWidth, outputHeight / qrHeight);
int leftPadding = (outputWidth - inputWidth * multiple) / 2;
int num = (outputHeight - inputHeight * multiple) / 2;
BitMatrix output = new BitMatrix(outputWidth, outputHeight);
int inputY = 0;
int outputY = num;
while (inputY < inputHeight)
{
int inputX = 0;
int outputX = leftPadding;
while (inputX < inputWidth)
{
if (input[inputX, inputY] == 1)
{
output.setRegion(outputX, outputY, multiple, multiple);
}
inputX++;
outputX += multiple;
}
inputY++;
outputY += multiple;
}
return output;
}
}
程序代码:Shared Function MakeQR(ByVal qrtext As String, Optional ByVal width As Integer = 800, Optional ByVal height As Integer = 800, Optional ByVal margin As Integer = 1) As Bitmap
Dim writer As New ZXing.BarcodeWriter
writer.Format = ZXing.BarcodeFormat.QR_CODE
Dim opt As New ZXing.QrCode.QrCodeEncodingOptions
opt.DisableECI = True '设置为True才可以调整编码
opt.CharacterSet = "UTF-8" '文本编码,建议设置为UTF-8
opt.Width = width '宽度
opt.Height = height '高度
opt.Margin = margin '边距,貌似不是像素格式,因此不宜设置过大
writer.Options = opt
Return writer.Write(qrtext)
End Function
Shared Function MakeQR(ByVal qrtext As String, ByVal logo As Bitmap, Optional ByVal width As Integer = 800, Optional ByVal height As Integer = 800, Optional ByVal margin As Integer = 1) As Bitmap
If logo Is Nothing Then
Return MakeQR(qrtext, width, height, margin)
End If
Dim writer As New ZXing.MultiFormatWriter
Dim hint As New Dictionary(Of ZXing.EncodeHintType, Object)()
hint.Add(ZXing.EncodeHintType.CHARACTER_SET, "UTF-8")
hint.Add(ZXing.EncodeHintType.MARGIN, margin)
hint.Add(ZXing.EncodeHintType.ERROR_CORRECTION, ZXing.QrCode.Internal.ErrorCorrectionLevel.H)
' 生成二维码
Dim bm As = writer.encode(qrtext, ZXing.BarcodeFormat.QR_CODE, width, height, hint)
Dim barcodeWriter = New ZXing.BarcodeWriter()
Dim bmp As Bitmap = barcodeWriter.Write(bm)
'获取二维码实际尺寸(去掉二维码两边空白后的实际尺寸)
Dim rectangle As Integer() = bm.getEnclosingRectangle()
'计算插入图片的大小和位置
Dim middleW As Integer = Math.Min((rectangle(2) / 3.5), logo.Width)
Dim middleH As Integer = Math.Min((rectangle(3) / 3.5), logo.Height)
Dim middleL As Integer = (bmp.Width - middleW) / 2
Dim middleT As Integer = (bmp.Height - middleH) / 2
'将img转换成bmp格式,否则后面无法创建Graphics对象
Dim bmpimg As New Bitmap(bmp.Width, bmp.Height, Imaging.PixelFormat.Format32bppArgb)
Using g As Graphics = Graphics.FromImage(bmpimg)
g.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
g.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
= (bmp, 0, 0)
End Using
'将二维码插入图片
Using myGraphic As Graphics = Graphics.FromImage(bmpimg)
'白底
myGraphic.FillRectangle(Brushes.White, middleL, middleT, middleW, middleH)
myGraphic.DrawImage(logo, middleL, middleT, middleW, middleH)
End Using
bmp.Dispose()
Return bmpimg
End Function
Shared Function ReadQR(ByVal bmp As Bitmap) As String
Dim reader As New ZXing.BarcodeReader
reader.Options.CharacterSet = "UTF-8"
Dim ret As ZXing.Result = reader.Decode(bmp)
If ret Is Nothing Then
Return Nothing
Else
Return ret.Text
End If
End Function[此贴子已经被作者于2018-12-22 21:01编辑过]






