C#--解析DataMatrix二維碼

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();   
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章