C#–解析DataMatrix二維碼
最近在玩解析圖片中的DM碼。DM碼在圖片中顯得尺寸小,而且也不清晰。一開始直接上谷歌的zxing,有些能解析出來,但是有些卻顯得無能爲力。後來找到一個DataMatrix.net,用它解析,成功率大大提升,但是耗時。在調用zxing或者DM進行解析時,進行了
1 裁減–把二維碼區域裁減出來(DM碼在圖片中太小,是必要的一步)
2 解析,如果不成功則旋轉90度解析,直到解析成功或則旋轉270度
其中,裁減這一步使用的是clone方法,但是不清楚爲何有時使用這個裁減出來的圖片zxing還是不能解析出來,但是使用win7系統自帶的畫圖裁減並另存爲jpg格式的時候,zxing卻能解析。百思不得其解。
另外,如何實現自動識別出二維碼區域呢?需要對圖像進行一些處理嗎?OpenCV?
2018-8-14
1 找出裁減圖片與win系統畫圖板裁減不一致的原因了,因爲沒有設置分辨率。
2 代碼如下
Rectangle imgRect = new Rectangle();
imgRect.X = rect.X * pictureBox1.Image.Width / pictureBox1.Width;
imgRect.Y = rect.Y * pictureBox1.Image.Height / pictureBox1.Height;
imgRect.Height = rect.Height * pictureBox1.Image.Height / pictureBox1.Height;
imgRect.Width = rect.Width * pictureBox1.Image.Width / pictureBox1.Width;
if (imgRect.Width == 0 || imgRect.Height == 0) return;
Bitmap srcImg = new Bitmap(textBox1.Text);
Bitmap b = new Bitmap(imgRect.Width, imgRect.Height);
b.SetResolution(pictureBox1.Image.HorizontalResolution, pictureBox1.Image.VerticalResolution);
b = srcImg.Clone(imgRect,srcImg.PixelFormat);
srcImg.Dispose();
pictureBox2.Image = b;
textBox2.Text = "解碼中...";
this.Update();
//DmtxImageDecoder DMdecoder = new DmtxImageDecoder();
BarcodeReader br = new BarcodeReader();
Result r = null;
string strDMCode = null;
for (int i = 0; i < 3; i++)
{
//List<string> result = DMdecoder.DecodeImage(bitmap);
r = br.Decode(b);
if (r != null)
{
strDMCode += "Zxing: " + r.Text + "\r\n";
break;
}
//if (result.Count > 0)
//{
// strDMCode += "DM: " + result[0] + "\r\n";
// //break;
//}
b.RotateFlip(RotateFlipType.Rotate90FlipNone);
}
if (strDMCode != null)
textBox2.Text = strDMCode;
else
textBox2.Text = "解碼失敗";
b.Dispose();