[CSharp]把WebCam當QRCode的DeCode解碼器

在解碼時利用Thread把解碼動作丟到另一個Thread來做,才不會影響到WebCam_Capture取得WebCam影像資料的動作,解碼內容利用invoke來呼叫Form設定TextBox值,直接在Thread上設TextBox值是不被容許的。

    this.textBox1.Text = "checking";
    System.Drawing.Bitmap img = new System.Drawing.Bitmap(this.pictureBox1.Image, this.pictureBox1.Image.Size);
    thread1 obj = new thread1(img, this);
    System.Threading.Thread t = new System.Threading.Thread(obj.runMe);
            
    t.Start();
class thread1
    {
        private System.Drawing.Bitmap picDecode;

        private Form1 form;
        public thread1(System.Drawing.Bitmap picDecode, Form1 form)
        {
            this.picDecode = picDecode;
            this.form = form;
        }
        public void runMe()
        {
            //while (true)
            {
                QrDecode(picDecode);


                //System.Threading.Thread.Sleep(1000);
            }
        }
        public void QrDecode(System.Drawing.Bitmap picDecode)
        {

            try
            {
                Reader reader = new MultiFormatReader();
                //MonochromeBitmapSource image = new BufferedImageMonochromeBitmapSource(new Bitmap(Image.FromFile("barcode.jpg")), false);
                RGBLuminanceSource source = new RGBLuminanceSource(picDecode, picDecode.Width, picDecode.Height);
                // BinaryBitmap bitmap = 
                BinaryBitmap image = new BinaryBitmap(new HybridBinarizer(source));
                Result result = (Result)reader.decode(image);
                string text = result.Text;
                
               
                BarcodeFormat format = result.BarcodeFormat;
                ResultPoint[] points = result.ResultPoints;
                Console.WriteLine("barcode text: {0}", text);
                //Console.WriteLine("raw bytes: {0}", rawbytes);
                Console.WriteLine("format: {0}", format);
                Console.ReadLine();
                form.Invoke(new Form1.decodeValue(form.setTextBox), new object[] { System.Text.Encoding.UTF8.GetString(System.Text.Encoding.GetEncoding("SJIS").GetBytes(text)), false });
                

            }
            catch (com.google.zxing.ReaderException ex)
            {
                
                form.Invoke(new Form1.decodeValue(form.setTextBox), new object[] { "error",true });
                
                return;
                
            }
            
        }
    }

原始碼:

執行檔 原始碼

本站下載

28 thoughts to “[CSharp]把WebCam當QRCode的DeCode解碼器”

  1. 版主您好:
    版主所發布的這篇剛好與我現在作的論文有關,不知是否可請版主提供開發環境。
    謝謝您~

  2. 請問一下這個掃描器
    用webcam拍攝
    由於我用在手機上
    手機上的qrcode不是有個定位的方塊
    產生的方塊大小如何改變
    想把定位方快變大 有辦法嗎

    製作qrcode的方法是從大大上一篇產生qrcode出來的^^

    1. 其實那個方塊是個假像而已…
      只是利用一個遮色片遮在那裡而已…
      並不會真的影響解碼能力

  3. this.textBox1.Text = “checking”;
    System.Drawing.Bitmap img = new System.Drawing.Bitmap(this.pictureBox1.Image, this.pictureBox1.Image.Size);
    thread1 obj = new thread1(img, this);
    System.Threading.Thread t = new System.Threading.Thread(obj.runMe);

    t.Start();

    上面段source code 是放在哪的??

    我用eclipse 可以用這段code嗎??

    1. 他的code lib是給csharp用的,如果你有裝eclipse的csharp開發環境是可以用的,否則則不行

  4. 版主您好:
     我想請問關於QRcode解碼的部份是否有C/C++的範例程式,或有可以更改輸入跟輸出方式的解碼範例,因為已經蒐尋很久實在找不到,所以想求助於版主,我的開發環境是Visual Studio 2008。

  5. 你好啊,那是不是,ENCODE跟DECODE都是一套用C#的語言寫的?!

    1. 其實不一定的….zxing他就提供多種程式語言的方式decode跟encode,你可以參考看看
      或著如果怕麻煩的話直接取用它complier好的dll,用程式呼叫dll指令也是可以的

  6. vCard 可以用WEBCAM scan嗎?scan其他可以,但vCard 是error??
    加我的msn ok?? (就是那個email,,我是香港的)

  7. 版主你好:
    請問該如何在thread1的class外(form1的class裡面)取得他解碼出來的文字呢?

  8. 版主你好:
    請問如何在thread1的class外面(form1的class裡面)取得解碼出來的字串呢?

    1. 你把解碼出來的東西set回去form裡的一個變數…然後再呼叫invoke去顯示在畫面上

  9. 版主你好:
    請問有沒有方法可以得知被分析的qrcode是位於圖片中的何處呢?

  10. 版主你好,執行檔與原始碼連結已經失效了,可否補上 謝謝

  11. 版主您好,請問您有在Win10下執行過嗎?

    我依照這個方法在開發環境Win7筆電下可以使用,
    但是拿到測試的Win10平板上,就無法開啟WebCam

    按下”Start”後出現錯誤訊息如下:

    An error ocurred while capturing the video image. The video capture will now be terminated.
    並未將物件參考設定為物件的執行個體

    請問是否有解??

    麻煩您了!

    1. 不好意思,我並沒有測試過windows 10喔
      如果您有找到解決方法,再請您告知,
      謝謝

      1. 版主您好,我使用您的程式修改成解析一維條碼,
        您程式內的舊版zxing.dll 不支援解析Code 93,
        新版的ZXing.Net.0.16.4.0有支援,新舊版的參數差異為RGBLuminanceSource,
        需將System.Drawing.Bitmap轉換為 byte[],
        我加入了函式 byte[] GetRGBValues,程式加入這個函式之後變得很難掃描條碼,
        且目前掃描出來的數字並不是正確的,還會辨識成錯誤格式
        請問版主,我是否在轉換的過程出了什麼問題呢?
        還是說新版的還要另外解析WebCam的圖檔呢?

        麻煩您了,謝謝!

  12. 版主您好,我成功將您的程式碼修改成可辨識一維條碼。
    但目前遇到一個問題,Code 93 無法辨識。
    查詢了相關資訊,發現版主使用的舊版zxing.dll未支援Code 93
    下載了新版的ZXing.Net.0.16.4.0,並且載入dll檔執行,
    遇到的問題為須將System.Drawing.Bitmap轉換為 byte[]

    ZXing.LuminanceSource source = new RGBLuminanceSource(GetRGBValues(picDecode), picDecode.Width, picDecode.Height);

    但目前掃描出來的數字並不是正確的,新舊版的參數差異為RGBLuminanceSource,
    我加入了函式 byte[] GetRGBValues,
    private byte[] GetRGBValues(System.Drawing.Bitmap picDecode)
    {
    // Lock the bitmap’s bits.
    System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, picDecode.Width, picDecode.Height);
    System.Drawing.Imaging.BitmapData bmpData = picDecode.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, picDecode.PixelFormat);

    // Get the address of the first line.
    IntPtr ptr = bmpData.Scan0;

    // Declare an array to hold the bytes of the bitmap.
    int bytes = bmpData.Stride * picDecode.Height;
    byte[] rgbValues = new byte[bytes];
    // Copy the RGB values into the array.
    System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);
    picDecode.UnlockBits(bmpData);

    return rgbValues;
    }

    請問版主,我是否在轉換的過程出了什麼問題呢?
    程式加入這個函式之後變得很難掃描條碼,
    還是說新版的還要另外解析webcam的圖檔呢?

    麻煩您了,謝謝!

  13. 版主您好,舊版的zxing.dll沒有支援Code 93
    但使用新版的ZXing.dll無法解析條碼
    請問您有什麼建議嗎
    謝謝

發表迴響