晚上好好帮助,
我正在尝试检测扫描的PDF上的QR码(打印带有qr的pdf然后扫描)QR码将始终位于文件的一角。在下面的代码中,我克隆了QR所在的区域。
帮助: - 查看文档以查看哪个角有图像(qr) - 找到具有qr代码的角后 - 旋转文件,使qr代码位于左上角。
代码:
for (int pg = 0; pg < inputDocument.PageCount; pg++)
{
QRCodeDecoder decoder = new QRCodeDecoder();
string workGif = workingFilename.Replace(".pdf", string.Format(".{0}.gif", pg + 1));
GhostscriptWrapper.GeneratePageThumb(workingFilename, workGif, pg + 1, 300, 300); // size (last two params) does not seem to have any effect
using (var fullImg = new Bitmap(workGif))
{
Bitmap result = fullImg;
//top-left
var bandImg1 = result.Clone(new System.Drawing.Rectangle(0, 0, result.Width/2, result.Height/2), fullImg.PixelFormat);
//top-right
var bandImg2 = result.Clone(new System.Drawing.Rectangle(result.Width / 2, 0, result.Width / 2, result.Height / 2), fullImg.PixelFormat);
//bottom-left
var bandImg3 = result.Clone(new System.Drawing.Rectangle(0, result.Height / 2, result.Width / 2, result.Height / 2), fullImg.PixelFormat);
//bottom-right
var bandImg4 = result.Clone(new System.Drawing.Rectangle(result.Width / 2, result.Height / 2, result.Width / 2, result.Height / 2), fullImg.PixelFormat);
//saving images for testing purpose just to see what was saved for each corner.
bandImg1.Save("c:\\bandImg1.gif", System.Drawing.Imaging.ImageFormat.Gif);
bandImg2.Save("c:\\bandImg2.gif", System.Drawing.Imaging.ImageFormat.Gif);
bandImg3.Save("c:\\bandImg3.gif", System.Drawing.Imaging.ImageFormat.Gif);
bandImg4.Save("c:\\bandImg4.gif", System.Drawing.Imaging.ImageFormat.Gif);
string QRinfo = Process(bandImg1);//this should pass in the bandImg depending on the above search finding which corner has a qr image
MessageBox.Show(QRinfo);
string[] qcode = QRinfo.Split('/');
string gid = qcode[qcode.Count() - 1];
Guid pgGuid = new Guid(gid);
var ar = dc.Assessments.FirstOrDefault(c => c.ID == pgGuid);
if (ar != null)
{
var p = inputDocument.Pages[pg];
string opdName = FILESTORELOCATION + pgGuid.ToString() + ".pdf";
PdfDocument opd = new PdfDocument(opdName);
opd.Pages.Add(p);
opd.Close();
ar.StoragePath = opdName;
ar.LastUploadedDT = DateTime.UtcNow;
ar.UploadedByUserID = uploadingUser;
dc.SubmitChanges();
}
}
//this.Refresh();
File.Delete(workGif);
}
处理方法:
public string Process(Bitmap bitmap)
{
var reader = new com.google.zxing.qrcode.QRCodeReader();
try
{
LuminanceSource source = new RGBLuminanceSource(bitmap, bitmap.Width, bitmap.Height);
var binarizer = new HybridBinarizer(source);
var binBitmap = new BinaryBitmap(binarizer);
return reader.decode(binBitmap).Text;
}
catch (Exception e)
{
return e.Message;
}
}
非常感谢任何帮助。
答案 0 :(得分:2)
我认为您需要将每个bandImg
传递给流程方法。根据哪一个返回一个有效的字符串,你就会知道你需要做的轮换。
//top left
var bandImg1 = result.Clone(new Rectangle(0, 0, result.Width / 2, result.Height / 2), result.PixelFormat);
//top right
var bandImg2 = result.Clone(new Rectangle(result.Width / 2, 0, result.Width / 2, result.Height / 2), result.PixelFormat);
//bottom left
var bandImg3 = result.Clone(new Rectangle(0, result.Height / 2, result.Width / 2, result.Height / 2), result.PixelFormat);
//bottom right
var bandImg4 = result.Clone(new Rectangle(result.Width / 2, result.Height / 2, result.Width / 2, result.Height / 2), result.PixelFormat);
Bitmap[] corners = new Bitmap[] { bandImg1, bandImg2, bandImg3, bandImg4 };
string QRinfo = "";
for (int i = 0; i < corners.Length; ++i)
{
string tmpQRinfo = Process(corners[i]);//this should pass in the bandImg depending on the above search finding which corner has a qr image
//check if string is valid, you'll need to figure out how to do this
if (valid)
{
QRinfo = tmpQRinfo;
switch(i)
{
case 0: //already in upper left, do nothing
break;
case 1: //upper right corner, so rotate the document -90 which is the same as 270
fullImg.RotateFlip(RotateFlipType.Rotate270FlipNone);
break;
case 2: //lower left corner, so rotate 90
fullImg.RotateFlip(RotateFlipType.Rotate90FlipNone);
break;
case 3: //lower right corner, so rotate 180
fullImg.RotateFlip(RotateFlipType.Rotate180FlipNone);
break;
}
break; //the QR was found, no need to continue searching
}
}
MessageBox.Show(QRinfo);