我有一个超过 800 个字符的数据字符串,我正试图将其压缩以用于 QR 码(我想要至少 50%,但如果我把它压缩到少于 700 个可能会很高兴) .这是我尝试压缩的示例字符串,包含 841 个字符:
+hgoSuJm2ecydQj9mXXzmG6b951L2KIl0k9VGzIEtLztuWO2On9rt7DUlH0lXzG4iJ1yK0fA
97mDyclKSttIZXOxSPBf85LEN4PUUqj65aio5qwZttZSZ64wpnMFg/7Alt1R39IJvTmeYfBm
Tuc1noMMcknlydFocwI8/sk2Sje5MR/nYNX0LPkQhzyi5vFJdrndqAgXYULsYrB3TJDAwvgs
Kw9C5EJnrlqcb21zg17O2gU/C8KY0pz9RPzUl1Sb0rCP8iZCeis4YbQ5tuUppOfnO/X0Mosv
SOQJ/bF9juKW8ocnQvNjsNxGV1gPkWWtiU2Old7Qm7FLDqL6kQKrq356yifs0NiMVGdvAg32
eugewuttCugoZASYOpQdwPu1jMxVO1fzF3zEy5w6tDlcfA2DZwa+un9/k8XZWAO/KVExy68q
UtVRQxsIOKgpl/2tNw5DBAKbykKIkmizbsA2xtzqnYqld4kOdNMJh3YjlqWF9Bt8MZo7a+Q6
jgayr2rjpyIptc599DGtvp68ZNQ64TKNmiMnnyGMo3E+xW34G3RrsYnHGm+xJoLKoOJhacDu
oZke1ycJgQv+Y61WPrvtFOVBxV5rvSzO0+8px5AWN3uCrrw1RmT5N14IVhh6BOtRjsifqIB2
dAKxzBNsvbXm1SzkuyqYiMnp5ivy3m2mPwc9GLsykx0FRIkhCYO8ins9E5ot9QvVnE155MFA
8FVwsP5uNdOF4EzQS2/h2QK3zb5Yq4Nftlo605Dd5vuVN/A7CUN38DaAKBxDKgqDzydfQnZw
R0hTfMHNLgBJKNDSpz2P6almGlUJtXT6IYmzuU2Iaion8ePG
我已经尝试过以下三个库:
我遇到了一个问题,即压缩实际上使字符串变长。我的理解是 DeflateStream 的开销最少,但它仍在添加字符。使用 DotNetZip,我告诉它使用最大压缩:
Imports Ionic.Zlib
Shared Function CompressData(data As Byte()) As Array
Dim msCompressed As MemoryStream = New MemoryStream
' I'm not sure if the last parameter on this next function should be
' true (for LeaveOpen), but it doesn't seem to affect it either way.
Dim deflated As DeflateStream = New DeflateStream(msCompressed, _
CompressionMode.Compress, CompressionLevel.BestCompression, True)
' Write data to compression stream (which is linked to the memorystream)
deflated.Write(data, 0, data.Length)
deflated.Flush()
deflated.Close()
Return msCompressed.ToArray
End Function
我只是认为情况会变得更糟,因为我将拥有更多数据。对于这种长度的字符串,是否有更好的压缩算法?压缩通常只适用于较长的字符串吗?不幸的是,数据是这样的,我不能为数据片段使用替代字符。
另外,我可以对二维码使用字母数字编码,还是必须使用二进制?我认为我不能,按照 http://www.qrme.co.uk/qr-code-forum.html?func=view&catid=3&id=324 ,但我想确定一下。
谢谢你的帮助!
最佳答案
这个答案与古法的答案有关。他说二维码可以接受二进制数据,这肯定是你使用的库的限制。
我查看了库的源代码。你调用 Encode 函数对吗?这是encode函数的内容
public virtual Bitmap Encode(String content, Encoding encoding)
{
bool[][] matrix = calQrcode(encoding.GetBytes(content));
SolidBrush brush = new SolidBrush(qrCodeBackgroundColor);
Bitmap image = new Bitmap( (matrix.Length * qrCodeScale) + 1, (matrix.Length * qrCodeScale) + 1);
Graphics g = Graphics.FromImage(image);
g.FillRectangle(brush, new Rectangle(0, 0, image.Width, image.Height));
brush.Color = qrCodeForegroundColor ;
for (int i = 0; i < matrix.Length; i++)
{
for (int j = 0; j < matrix.Length; j++)
{
if (matrix[j][i])
{
g.FillRectangle(brush, j * qrCodeScale, i * qrCodeScale, qrCodeScale, qrCodeScale);
}
}
}
return image;
}
第一行 (encoding.GetBytes(content)) 将字符串转换为字节。
获取源代码然后修改它有这个功能:“public virtual Bitmap Encode(bytes[] content)”
关于vb.net - 是否有比 DotNetZip 或 LZMA 更好的字符串压缩库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7130052/