Đọc chuỗi ký tự từ mã QR Code

13:26 13/02/2023

Cùng học cách quét mã QR Code lưu một chuỗi ký tự bằng Webcam của laptop, sử dụng thư viện Google Zxing library và thư viện chụp ảnh màn hình Webcam Capture hiển thị trong Java Swing trong bài viết dưới đây!

QR Code (Quick Response Cod) – được gọi là mã vạch ma trận (matrix-barcode) 2 chiều được quét bằng smartphone hoặc những thiết bị chuyên dụng. Mã QR Code sử dụng để mã hóa các loại dữ liệu khác nhau. Trong thực tiễn, ứng dụng của QR Code có thể kể đến như:

  • Lưu trữ thông tin URL
  • Lưu trữ mã vận đơn, thông tin hàng hóa để kiểm kê
  • Thông tin card visit
  • Code vé ở các trạm xe khách, tàu
  • Truyền thông quảng cáo

Vậy với một developer , thì việc quét mã QR sẽ diễn ra như thế nào? Hãy tìm hiểu kỹ hơn ở phần thông tin dưới đây!

  1. Thêm thư viện vào Project

Để thực hiện việc quét mã QRCode chúng ta cần 2 thư viện là Google Zxing và Webcam Capture. Trong bài viết sẽ hướng dẫn các bạn thêm thư viện vào Project Maven có cấu trúc như sau:

Sau khi đã tạo được Project ta sẽ thêm thư viện Google Zxing trước. Các bạn chọn một phiên bản mới nhất hoặc có nhiều người sử dụng nhất.  .  (Bài viết đang lựa chọn phiên bản 3.5.0.)

Sau khi chọn được phiên bản, các bạn click vào phiên bản đó và copy toàn bộ trong phần Maven như sau:

Sau đó các bạn mở file pom.xml trong Project vừa tạo. Thêm một thẻ ** và dán toàn bộ phần vừa copy ở trên vào trong thẻ.

Các bạn tiếp tục làm tương tự và thêm thư viện Webcam Capture  và thư viện ZXing Java SE Extensions  vào file pom.xml. Sau khi thêm thành công File pom.xml của các bạn sẽ có dạng như sau:

  1. Quét mã QR trong Java Swing.

Trong Project ta vừa tạo, tác giả đã tạo một jFrame có gồm 3 thành phần với tên biến như sau:

  • jPanel – showPanel : Hiển thị Webcam
  • jLabel : Tiêu đề cho kết quả
  • jTextField – txtResult : Hiển thị kết quả đọc được.

Khi chương trình chạy thành công, các bạn có thể chỉnh kích thước sao cho phù hợp với diện tích hiển thị. Thành phần showPanel các bạn click phải chọn Set layout và chọn Absolute Layout.

Giờ chúng ta hãy bắt đầu vào tiến hành code. Ở đây, tác giả sử dụng trực tiếp trên jFrame nên các thành phần thuộc tính của jFrame sẽ được để toàn bộ là private.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

import com.github.sarxos.webcam.Webcam;

import com.github.sarxos.webcam.WebcamPanel;

import com.github.sarxos.webcam.WebcamResolution;

import com.google.zxing.BinaryBitmap;

import com.google.zxing.LuminanceSource;

import com.google.zxing.MultiFormatReader;

import com.google.zxing.NotFoundException;

import com.google.zxing.Result;

import java.awt.Dimension;

import java.awt.image.BufferedImage;

import java.util.logging.Level;

import java.util.logging.Logger;

import com.google.zxing.client.j2se.BufferedImageLuminanceSource;

import com.google.zxing.common.HybridBinarizer;

 

public class ScanQr extends javax.swing.JFrame {

 

//Khai báo 1 đối tượng Webcam

private Webcam webcam;

//Khai báo 1 đối tượng Panel để chứa đối tượng webcam

private WebcamPanel webcamPanel;

//Tạo ra một Thread chạy song song với Thread chính

//để có thể chụp ảnh liên tiếp mà k ảnh hưởng đến thread chính

private Thread captureThread;

 

public ScanQr() {

     initComponents();

     //gọi hàm khởi tạo Webcam và hàm tạo thread ngay

     //khi jFrame được khởi tạo

     initWebcam();

     captureThread();

}

 

//Tạo ra một hàm để khởi tạo và hiển thị Webcam

private void initWebcam() {

     //khởi tạo thuộc tính webcam của jFrame

     //qua hàm getWebcam của lớp Webcam

     webcam = Webcam.getWebcams().get(0);

 

     //Tạo một đối tượng Dimension để lấy kích thước

     //của độ phân giải VGA qua hàm getSize() của lớp

     //WebcamResolution.

     Dimension size = WebcamResolution.VGA.getSize();

     //Set kích thước hiển thị của webcam theo đối tượng

     //Dimension vừa tạo

     webcam.setViewSize(size);

 

     //Khởi tạo thuộc tính webcamPanel với tham số

     //là thuộc tính webcam

     webcamPanel = new WebcamPanel(webcam);

     //Set kích thước của panel bằng với kích thước

     //hiển thị của webcam

     webcamPanel.setPreferredSize(size);

     //Set thuộc tính FPSDisplayed của panel thành true

     //để hiển thị số khung hình lên

     webcamPanel.setFPSDisplayed(true);

 

     //Thêm webcamPanel vào showPanel mà chúng ta đã tạo

     //lúc đầu và set vị trị của webcamPanel thông qua

     //hàm khởi tạo của Absolute Layout

     showPanel.add(webcamPanel, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 680, 480));

 

}

 

//Tạo một hàm chụp ảnh và giải mã QRCode trong ảnh

//và sẽ được chạy trong Thread ta đã khai báo lúc đầu

public void captureThread() {

     captureThread = new Thread() {

         //Ghi đề phương thức run để thực hiện code

         @Override

         public void run() {

             //tạo một vòng while để Thread thực hiện

             //chụp ảnh liên tục

             do {

                 try {

                     //Sử dụng phương thức sleep() của Thread

                     //để sau mỗi 100mili giây mới tiến hành chụp

                    Thread.sleep(100);

                 } catch (InterruptedException ex) {

                     ex.printStackTrace();

                 }

                   

                 //Khai báo một đối tượng Result thuộc thư viện Zxing

                //để lưu kết quả giải mã

                 Result result = null;

                   

                 //Tạo một đối tượng ảnh để lưu ảnh chụp được

                 BufferedImage image = null;

                   

                 //Kiểm tra xem webcam đã mở hay chưa

                 if (webcam.open()) {

                     //Nếu webcam không trả về ảnh được ảnh chụp thì

                     //lặp lại vòng lặp ngay lập tức

                     if ((image = webcam.getImage()) == null) {

                         continue;

                     }

                 }

                   

                 //Tạo một đối tượng để giải mã ảnh vừa chụp được

                 //ra dạng Bitmap

                 LuminanceSource source = new BufferedImageLuminanceSource(image);

                   

                 //Tạo một đối tượng Bitmap để lưu bitmap vừa được giải mã

                 BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

                 

                 try {

                     //Giải mã bitmap thông qua đối tượng MultiFormatReader

                     //với phương thức decode() và lưu vào biến result

                     result = new MultiFormatReader().decode(bitmap);

                 } catch (NotFoundException ex) {

                    ex.printStackTrace();

                 }

                 //Kiểm tra nếu giải mã thành công và gán giá trị

                 //cho biến result thì in kết quả đó lên TextField

                 if (result != null) {

                     txtResult.setText(result.getText());

                 }                  

             } while (true); //Vòng lặp vô hạn                            

         }

     };

     //Set thread này là một Daemon thread và chạy thread

     captureThread.setDaemon(true);

     captureThread.start();

}                      

 

//Phần hàm Main của jFrame

public static void main(String args[]) {

     /* Set the Nimbus look and feel */

     //<editor-fold defaultstate=”collapsed” desc=” Look and feel setting code (optional) “>

     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.

      * For details see //download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html

      */

     try {

         for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {

             if (“Nimbus”.equals(info.getName())) {

                 javax.swing.UIManager.setLookAndFeel(info.getClassName());

                 break;

             }

         }

     } catch (ClassNotFoundException ex) {

         java.util.logging.Logger.getLogger(ScanQr.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

     } catch (InstantiationException ex) {

         java.util.logging.Logger.getLogger(ScanQr.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

     } catch (IllegalAccessException ex) {

         java.util.logging.Logger.getLogger(ScanQr.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

     } catch (javax.swing.UnsupportedLookAndFeelException ex) {

         java.util.logging.Logger.getLogger(ScanQr.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);

     }

     java.awt.EventQueue.invokeLater(new Runnable() {

         public void run() {

             new ScanQr().setVisible(true);

         }

     });

}               

private javax.swing.JLabel jLabel1;

private javax.swing.JScrollPane jScrollPane1;

private javax.swing.JPanel showPanel;

private javax.swing.JTextArea txtResult;                

}

Sau khi hoàn thành, các bạn chạy file và tận hưởng thành quả Webcam hiển thị trên màn hình jFrame. Các bạn có thể tự tạo một mã QR lưu chuỗi ký tự bất kỳ . Sau đó lưu hình ảnh về điện thoại và quay về phía Webcam để phần đọc. Nếu thành công màn hình sẽ hiển thị kết quả như sau:

Trên đây là bài viết hướng dẫn các bạn cách để quét và giải mã một QRCode thông qua Webcam laptop, sử dụng thư viện Google Zxing và thư viện Webcam Capture. Chúc các bạn thành công!

Bộ môn Ứng dụng phần mềm
Cao đẳng FPT Mạng cá cược bóng đá Hà Nội

Cùng chuyên mục

Đăng Kí học Fpoly 2023

Bình Luận