我的代码在这里有效,但需要几秒钟的时间,而且文件较大则需要更长的时间,我想知道是否有人可以查看我的内容,并建议任何有助于加快速度的改进。
目的:
这是扫描pdf文件并搜索QR码的位图图像,它将返回它的代码(解码)
private void ScanQRPdf(string imagePath)
{
foreach (var item in Directory.GetFiles(imagePath))
{
if (Path.GetExtension(item).ToLower() == ".png")
{
Bitmap b = new Bitmap(imagePath);
try
{
QRCodeDecoder decoder = new QRCodeDecoder();
String decodedString = decoder.decode(new QRCodeBitmapImage(b));
rtbpdfData.Text += decodedString + "\n";
}
catch (Exception ex)
{
}
}
}
}
static void AddQRTag(PdfSharp.Drawing.XGraphics gfx, int xPosition, int yPosition, string QRdata, string HRdata)
{
gfx.DrawRectangle(XBrushes.White, xPosition, yPosition, xPosition + 55, yPosition + 85);
PdfSharp.Drawing.XImage xImage =
PdfSharp.Drawing.XImage.FromGdiPlusImage(BuildQR(QRdata.ToUpper(), 3,
QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC, 2, QRCodeEncoder.ERROR_CORRECTION.M));
gfx.DrawImage(xImage, xPosition + 5, yPosition + 5, xImage.PixelWidth * .8, xImage.PixelWidth * .8);
XFont font = new XFont("OCR B", 6);
XTextFormatter tf = new XTextFormatter(gfx);
tf.Alignment = XParagraphAlignment.Left;
XRect layout = new XRect(xPosition + 5, yPosition + 55, 55, 30);
tf.DrawString(HRdata.ToUpper(), font, XBrushes.Black, layout, XStringFormats.TopLeft);
}
答案 0 :(得分:3)
在代码中,你过去的一切都没问题。问题必须在QRCodeDecoder.decode函数中。如果您通过Bitmap.GetPixel函数逐像素扫描图像,则会浪费大量时间。更好的方法是使用不安全的代码并将位图转换为BitmapData。
答案 1 :(得分:2)
要尝试的一些事项:
QRCodeDecoder
StringBuilder
附加文字并仅分配一次会是这样的:
private void ScanQRPdf(string imagePath)
{
var files = Directory.GetFiles ( path, "*.png", SearchOption.AllDirectories );
QRCodeDecoder decoder = new QRCodeDecoder();
StringBuilder sb = new StringBuilder();
foreach (var item in files)
{
Bitmap b = new Bitmap(imagePath);
try
{
String decodedString = decoder.decode(new QRCodeBitmapImage(b));
sb.AppendLine(decodedString);
}
catch (Exception ex)
{
}
}
rtbpdfData.Text = sb.ToString();
}
但我真的不认为它会解决你的问题,这是所有微小的改进,你的延迟必须在QRCodeDecoder
和QRCodeBitmapImage
类的某个地方,特别是在decode
方法中,您应该尝试更好地理解它们,并找出它在内部的作用,以便您可以改进代码。
答案 2 :(得分:2)
根据您的评论,如果您只需要处理图片的左上角,则可以使用Bitmap.Clone
提取图片的这一部分。
在这种情况下,我会将您的代码重构为以下内容:
private void ScanQRPdf(string imagePath)
{
foreach (var decodedString in DecodeAllImagesInFolder(imagePath))
{
rtbpdfData.Text += decodedString + "\n";
}
}
private static IEnumerable<string> DecodeAllImagesInFolder(string imagePath)
{
foreach (var item in Directory.GetFiles(imagePath, "*.png"))
{
using (Bitmap b = new Bitmap(imagePath))
{
yield return DecodeTopLeftCorner(b);
}
}
}
private static string DecodeTopLeftCorner(Bitmap bitmap)
{
var rect = new Rectangle(0, 0, 100, 100);
using (var topLeft = bitmap.Clone(rect, bitmap.PixelFormat))
{
return new QRCodeDecoder().decode(new QRCodeBitmapImage(topLeft));
}
}
答案 3 :(得分:1)
您可以使用类型为
的GetFilesstring[ ] files = Directory.GetFiles ( path, "*.png", SearchOption.AllDirectories );