ThoughtWorks.QRCode 生成二维码名片(实现二维码内容换行)

最近在写一个很简单的功能,按照Vcard的格式,生成二维码名片。本来以为分分钟完事的事情,替换数据,直接调用dll去生成二维码。

测试时,发现生成的二维码使用微信扫描得到的名片信息为空,反向解析发现,二维码的内容文本是Vcard格式,但是却是在一行,而只有按照Vcard一行一行的显示才能读取出名片信息。

试了多种方式,不行,话不多说直接上文本处理代码

 1   if(strContent.Split('-').Length>1)
 2                 {
 3                     StringBuilder content = new StringBuilder();
 4                     foreach (string item in strContent.Split('-'))
 5                     {
 6                         content.Append(item);
 7                         content.Append("\r\n");
 8                     }
 9                     strContent = content.ToString();
10                 }
View Code

 

转载于:https://www.cnblogs.com/qzzy/p/10276154.html

20190427 功能:[修正版]修改ReportBuilder支持QRCode二维码 注: 1、DelphiZXIngQRCode.pas 为用到的二维码生成源码,来源https://github.com/foxitsoftware/DelphiZXingQRCode,版权由原作者所有 2、rbRCL106.bpl 为已经重新编译好的含可以生成QRCode二维码的bpl文件,也是目标文件 3、old文件夹里是旧源码备份 4、new文件夹里的pas文件为修改后的源码文件 实现步骤: 1、 需要修改RB源码文件,new文件夹里的pas文件为已经修改好的了,只要放到rb的source目录下替换掉旧文件则可: ppBarCode2DDrawCmd.pas ppSt2DBarC.pas ppTypes.pas 2、把DelphiZXIngQRCode.pas文件同时拷贝到rb的source目录下 3、使用delphi打开rb的source目录下的rbRCL106.dpk项目,然后编译,输出的rbRCL106.bpl文件为目标文件(一般输出到这个目录下Delphi6\Projects\Bpl) 4、把rbRCL106.bpl文件替换掉原安装rb时的同名文件则可,一般该文件放在windows\system32下,如果是发布给客户用的话,直接把该文件给客户则可 附: a、支持中文,具体可以在TppStMaxiCodeBarcode.GenerateBarcodeBitmap_QRCode这里设置QRCode.Encoding来支持具体的字符集。 QQ扫码支持中文,但微信目前却不支持。 b、现在二维码的大小是固定,信息容量不大,如果信息量过大就不好识别,61*61的话在100个字以内,89*89的话在250个字以内,129的话在500个字以内, 可以在TppStMaxiCodeBarcode.Create设置长宽实现。参考《QRCode_编码解码标准.pdf》第13页表格对照。 James 20190427 QQ:825818689
在使用 ZXing 生成二维码时,可以通过设置 `BitMatrix` 对象的属性来控制标题的换行。具体来说,可以使用 `\n` 字符来表示换行,然后将整个标题字符串赋值给 `BitMatrix` 对象的 `setRegion()` 方法中的 `hints` 参数,示例代码如下: ``` import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import java.util.HashMap; import java.util.Map; public class QRCodeGenerator { public static void main(String[] args) throws WriterException { String title = "This is a\nmulti-line\ntitle."; int width = 300; int height = 300; Map<EncodeHintType, Object> hints = new HashMap<>(); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); hints.put(EncodeHintType.MARGIN, 1); hints.put(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.L); QRCodeWriter writer = new QRCodeWriter(); BitMatrix matrix = writer.encode("https://www.example.com/", BarcodeFormat.QR_CODE, width, height, hints); int startX = (width - matrix.getWidth()) / 2; int startY = (height - matrix.getHeight()) / 2; for (int x = 0; x < matrix.getWidth(); x++) { for (int y = 0; y < matrix.getHeight(); y++) { boolean isBlack = matrix.get(x, y); int color = isBlack ? 0xFF000000 : 0xFFFFFFFF; if (y >= startY && y < startY + title.split("\n").length * 20) { int line = (y - startY) / 20; String lineText = title.split("\n")[line]; if (x >= startX && x < startX + lineText.length() * 10) { int charPos = (x - startX) / 10; char c = lineText.charAt(charPos); if (c == ' ') { color = 0x00000000; } } } // set pixel color } } } } ``` 在上述代码中,我们使用 `title.split("\n").length * 20` 来计算标题所占用的高度,其中 20 表示每行标题的高度为 20 像素。然后,在遍历二维码矩阵时,如果当前像素位于标题所占用的区域内,就根据像素位置来判断是否需要将像素颜色设置为透明。注意,这里我们假设每个字符的宽度为 10 像素,因此使用 `lineText.length() * 10` 来计算每行标题的宽度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值