使用zxing编写的二维码生成解析工具:QRCoder
TipDialog.java
package com.wolf_pan; import java.util.Timer;
import java.util.TimerTask;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel; public class TipDialog extends JDialog { public TipDialog(JFrame owner, String tip, int width, int height) {
super.setUndecorated(true);
super.setSize(width, height);
super.setLocationRelativeTo(owner);
super.add(new JLabel("<html><font color=\"red\">" + tip + "</font></html>", JLabel.CENTER));
} public void show(long duration) {
setVisible(true);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
dispose();
}
}, duration);
}
}
PicFileChooser.java
package com.wolf_pan; import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter; public class PicFileChooser extends JFileChooser { public PicFileChooser() { FileNameExtensionFilter filter1 = new FileNameExtensionFilter("ICO (*.ico)", "ico");
FileNameExtensionFilter filter2 = new FileNameExtensionFilter("PNG (*.png)", "png");
FileNameExtensionFilter filter3 = new FileNameExtensionFilter("TIFF (*.tif;*.tiff)", "tif", "tiff");
FileNameExtensionFilter filter4 = new FileNameExtensionFilter("GIF (*.gif)", "gif");
FileNameExtensionFilter filter5 = new FileNameExtensionFilter("JPEG (*.jpg;*.jpeg;*.jpe;*.jfif)", "jpg", "jpeg", "jpe", "jfif");
FileNameExtensionFilter filter6 = new FileNameExtensionFilter("Bitmap Files (*.bmp)", "bmp", "dib");
FileNameExtensionFilter filter7 = new FileNameExtensionFilter("All Picture Files", "ico", "png", "tif", "tiff", "gif", "jpg", "jpeg", "jpe", "jfif", "bmp", "dib");
super.setFileFilter(filter1);
super.setFileFilter(filter2);
super.setFileFilter(filter3);
super.setFileFilter(filter4);
super.setFileFilter(filter5);
super.setFileFilter(filter6);
super.setFileFilter(filter7);
super.setAcceptAllFileFilterUsed(false);
}
}
MainFrame.java
package com.wolf_pan; import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.EncodeHintType;
import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import com.google.zxing.qrcode.QRCodeWriter;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Desktop;
import java.awt.FlowLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.event.ChangeEvent;
import javax.swing.filechooser.FileNameExtensionFilter; public class MainFrame extends JFrame { private JTabbedPane tabbedPane;
private HintTextArea textToEncodeHintTextArea;
private JTextArea decodedResultTextArea;
private JLabel encodedImageLabel, qrcodeToDecodeLabel, tipLabel;
private JButton encodeButton, chooseButton, decodeButton, contactAuthorButton;
private JPopupMenu popupMenu;
private JMenuItem copyMenuItem, saveMenuItem;
private BufferedImage qrcodeBufferedImage;
private String qrcodePicFilename;
private static final Logger LOGGER = Logger.getLogger(MainFrame.class.getName()); private MainFrame() {
super("QRCoder");
initializeComponents();
initializeEventListeners();
} private void initializeComponents() {
setSize(400, 600);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
tabbedPane = new JTabbedPane();
JPanel encodePanel = new JPanel(new BorderLayout()), decodePanel = new JPanel(new BorderLayout()), authorPanel = new JPanel(new BorderLayout());
textToEncodeHintTextArea = new HintTextArea("Type text you want to encode here", 4);
encodePanel.add(new JScrollPane(textToEncodeHintTextArea), BorderLayout.NORTH);
encodedImageLabel = new JLabel();
encodedImageLabel.setHorizontalAlignment(JLabel.CENTER);
encodePanel.add(encodedImageLabel);
JPanel southEncodePanel = new JPanel(new FlowLayout(FlowLayout.RIGHT, 10, 0));
tipLabel = new JLabel("<html><font color=\"blue\" size=\"8\">Tip</font></html>");
southEncodePanel.add(tipLabel);
encodeButton = new JButton("Encode");
southEncodePanel.add(encodeButton);
encodePanel.add(southEncodePanel, BorderLayout.SOUTH);
tabbedPane.add("Encode", encodePanel);
JPanel northPanel = new JPanel(new BorderLayout());
JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
chooseButton = new JButton("Choose...");
buttonPanel.add(chooseButton);
decodeButton = new JButton("Decode");
buttonPanel.add(decodeButton);
northPanel.add(buttonPanel, BorderLayout.NORTH);
decodedResultTextArea = new JTextArea(4, 0);
decodedResultTextArea.setLineWrap(true);
decodedResultTextArea.setEditable(false);
JPanel decodedResultPanel = new JPanel(new BorderLayout());
JLabel decodedResultLabel = new JLabel("<html><font size=\"5\">Decoded result:</font></html>");
decodedResultPanel.add(decodedResultLabel, BorderLayout.NORTH);
decodedResultPanel.add(new JScrollPane(decodedResultTextArea));
northPanel.add(decodedResultPanel);
decodePanel.add(northPanel, BorderLayout.NORTH);
qrcodeToDecodeLabel = new JLabel(new ImageIcon(MainFrame.class.getResource("/images/author.jpg")));
decodePanel.add(qrcodeToDecodeLabel);
tabbedPane.add("Decode", decodePanel);
JLabel authorLabel = new JLabel("<html><br /><font size=\"20\">作者:布伊什<br />QQ: 980639902</font></html>", JLabel.CENTER);
authorPanel.add(authorLabel, BorderLayout.NORTH);
JLabel authorQRCodeLabel = new JLabel(new ImageIcon(MainFrame.class.getResource("/images/author.jpg")));
authorPanel.add(authorQRCodeLabel);
contactAuthorButton = new JButton("联系作者");
JPanel contactAuthorButtonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT));
contactAuthorButtonPanel.add(contactAuthorButton);
authorPanel.add(contactAuthorButtonPanel, BorderLayout.SOUTH);
tabbedPane.add("Author", authorPanel);
add(tabbedPane);
popupMenu = new JPopupMenu();
copyMenuItem = new JMenuItem("Copy");
popupMenu.add(copyMenuItem);
saveMenuItem = new JMenuItem("Save");
popupMenu.add(saveMenuItem);
} private void initializeEventListeners() {
tabbedPane.addChangeListener((ChangeEvent ev) -> {
if (tabbedPane.getSelectedIndex() == 0) {
encodeButton.requestFocus();
}
});
encodeButton.addActionListener((ActionEvent ev) -> {
onEncodeButtonClicked();
});
chooseButton.addActionListener((ActionEvent ev) -> {
onChooseButtonClicked();
});
decodeButton.addActionListener((ActionEvent ev) -> {
onDecodeButtonClicked();
});
contactAuthorButton.addActionListener((ActionEvent ev) -> {
onContactAuthorButtonClicked();
});
encodedImageLabel.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent ev) {
onEncodedImageLabelClicked(ev);
}
});
tipLabel.addMouseListener(new MouseAdapter() {
private TipDialog tipDialog; @Override
public void mouseEntered(MouseEvent ev) {
tipDialog = new TipDialog(MainFrame.this, "右键单击生成的二维码弹出工具菜单", 220, 30);
tipDialog.setVisible(true);
} @Override
public void mouseExited(MouseEvent ev) {
tipDialog.dispose();
}
});
copyMenuItem.addActionListener((ActionEvent ev) -> {
onCopyMenuItemClicked();
});
saveMenuItem.addActionListener((ActionEvent ev) -> {
onSaveMenuItemClicked();
});
} private void onEncodeButtonClicked() {
try {
String contents = textToEncodeHintTextArea.getText();
int width = encodedImageLabel.getWidth() - 20;
int height = encodedImageLabel.getHeight() - 20;
HashMap<EncodeHintType, String> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix bitMatrix = new QRCodeWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, hints);
qrcodeBufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int y = 0; y < height; ++y) {
for (int x = 0; x < width; ++x) {
Color color = bitMatrix.get(x, y) ? Color.BLACK : Color.WHITE;
qrcodeBufferedImage.setRGB(x, y, color.getRGB());
}
}
encodedImageLabel.setIcon(new ImageIcon(qrcodeBufferedImage));
} catch (WriterException ex) {
LOGGER.log(Level.SEVERE, null, ex);
JOptionPane.showMessageDialog(this, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
}
} private void onChooseButtonClicked() {
PicFileChooser picFileChooser = new PicFileChooser();
if (picFileChooser.showOpenDialog(this) == PicFileChooser.APPROVE_OPTION) {
qrcodePicFilename = picFileChooser.getSelectedFile().getAbsolutePath();
qrcodeToDecodeLabel.setIcon(new ImageIcon(qrcodePicFilename));
}
} private void onDecodeButtonClicked() {
try {
BufferedImage qrcodeToDecodeBufferedImage;
if (qrcodePicFilename == null) {
qrcodeToDecodeBufferedImage = ImageIO.read(MainFrame.class.getResource("/images/author.jpg"));
} else {
qrcodeToDecodeBufferedImage = ImageIO.read(new File(qrcodePicFilename));
}
BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(qrcodeToDecodeBufferedImage);
String decodedText = new QRCodeReader().decode(new BinaryBitmap(new HybridBinarizer(source))).getText();
decodedResultTextArea.setText(decodedText);
} catch (ChecksumException | FormatException | NotFoundException | IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
if (ex instanceof NotFoundException) {
JOptionPane.showMessageDialog(this, "QR code not found", "Error", JOptionPane.ERROR_MESSAGE);
} else {
JOptionPane.showMessageDialog(this, "Cannot decode the QR code", "Unknown Error", JOptionPane.ERROR_MESSAGE);
}
}
} private void onContactAuthorButtonClicked() {
try {
Desktop.getDesktop().browse(URI.create("tencent://message/?uin=980639902"));
} catch (IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
}
} private void onEncodedImageLabelClicked(MouseEvent ev) {
if (ev.getButton() == MouseEvent.BUTTON3) {
popupMenu.show(encodedImageLabel, ev.getX(), ev.getY());
}
} private void onCopyMenuItemClicked() {
if (qrcodeBufferedImage != null) {
ImageSelection contents = new ImageSelection(qrcodeBufferedImage);
Toolkit.getDefaultToolkit().getSystemClipboard().setContents(contents, null);
TipDialog tipDialog = new TipDialog(this, "Copied to clipboard", 150, 30);
tipDialog.show(1500);
}
} private void onSaveMenuItemClicked() {
if (qrcodeBufferedImage != null) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileFilter(new FileNameExtensionFilter("PNG (*.png)", "png"));
fileChooser.setFileFilter(new FileNameExtensionFilter("Bitmap Files (*.bmp)", "bmp"));
fileChooser.setAcceptAllFileFilterUsed(false);
if (fileChooser.showSaveDialog(this) == PicFileChooser.APPROVE_OPTION) {
try {
String formatName;
if (fileChooser.getFileFilter().getDescription().equals("PNG (*.png)")) {
formatName = "png";
} else {
formatName = "bmp";
}
File destinationFile = new File(fileChooser.getSelectedFile() + "." + formatName);
if (ImageIO.write(qrcodeBufferedImage, formatName, destinationFile)) {
TipDialog tipDialog = new TipDialog(this, "Saved to disk", 150, 30);
tipDialog.show(1500);
}
} catch (IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
}
}
}
} public static void main(String[] args) {
MainFrame mainFrame = new MainFrame();
mainFrame.setVisible(true);
}
}
ImageSelection.java
package com.wolf_pan; import java.awt.Image;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException; public class ImageSelection implements Transferable { private final Image image; public ImageSelection(Image image) {
this.image = image;
} @Override
public DataFlavor[] getTransferDataFlavors() {
return new DataFlavor[]{DataFlavor.imageFlavor};
} @Override
public boolean isDataFlavorSupported(DataFlavor flavor) {
return flavor.equals(DataFlavor.imageFlavor);
} @Override
public Image getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
if (!isDataFlavorSupported(flavor)) {
throw new UnsupportedFlavorException(flavor);
}
return image;
}
}
HintTextArea.java
package com.wolf_pan; import java.awt.Color;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JTextArea; public class HintTextArea extends JTextArea {
public HintTextArea(String hint, int rows) {
super(hint, rows, 0);
super.setForeground(Color.GRAY);
super.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
if (getForeground() == Color.GRAY && hint.equals(getText())) {
setText(null);
setForeground(Color.BLACK);
}
} @Override
public void focusLost(FocusEvent e) {
if (getText().equals("")) {
setText(hint);
setForeground(Color.GRAY);
}
}
});
}
}
使用zxing编写的二维码生成解析工具:QRCoder的更多相关文章
- [开源]C#二维码生成解析工具,可添加自定义Logo
二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能存更多的信息,也能表示更多的数据类型:比如:字 ...
- [开源]C#二维码生成解析工具,可添加自定义Logo (转)
二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能存更多的信息,也能表示更多的数据类型:比如:字 ...
- C#二维码生成解析
C#二维码生成解析工具,可添加自定义Logo 二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能 ...
- java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例
java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍 我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream ou ...
- Java二维码生成与解码
基于google zxing 的Java二维码生成与解码 一.添加Maven依赖(解码时需要上传二维码图片,所以需要依赖文件上传包) <!-- google二维码工具 --> &l ...
- Java二维码生成与解码工具Zxing使用
Zxing是Google研发的一款非常好用的开放源代码的二维码生成工具,目前源码托管在github上,源码地址: https://github.com/zxing/zxing 可以看到Zxing库有很 ...
- atitit.二维码生成总结java zxing
atitit.二维码生成总结java zxing #-----zxing类库.. but zxing3.0 的类库core-3.0.jar 需要jdk7 只好zing2.2.jar ..jdk6走o ...
- java利用Google Zxing实现 二维码生成与解析
1.引入zxing 2.使用下面两个类:QRCodeUtil.java和BufferedImageLuminanceSource.java 3.新建单元测试类 复制下面测试代码即可. 1.pom文件中 ...
- 谷歌zxing 二维码生成工具
一.加入maven依赖 <!-- 谷歌zxing 二维码 --> <dependency> <groupId>com.google.zxing</groupI ...
随机推荐
- 好未来谢华亮:AI 在教育行业中的应用
11 月 23 日,在以「AI 产业技术的渗透与融合」为主题的 NIUDAY 北京站中,好未来 SEG 智慧教育事业部技术总监谢华亮为大家带来了关于「AI 在教育行业中的应用」的分享. 本文是对分享内 ...
- 常州模拟赛d3t2 灰狼呼唤着同胞
题目背景 我的母亲柯蒂丽亚,是一个舞者.身披罗纱,一身异国装扮的她,来自灰狼的村子. 曾经在灰狼村子担任女侍的她,被认定在某晚犯下可怕的罪行之后,被赶出了村子. 一切的元凶,都要回到母亲犯下重罪的那一 ...
- 【leetcode 字符串】466. Count The Repetitions
https://leetcode.com/problems/count-the-repetitions/description/ 找循环节 https://www.cnblogs.com/grandy ...
- JavaScript ES6中,export与export default
自述: 本来是对new Vue()和export default比较懵的,查了一下,发现我理解错了两者的关系,也没意识到export与export default的区别,先简单的记录一下基本概念,后续 ...
- c字符和字符数组/字符串
一维和二维的都可以:一维的情况如下:1,char string0[10];2,char string1[]="prison break";3,char string2[100]=& ...
- Loj #6307. 「雅礼国庆 2017 Day1」Clique
link: https://loj.ac/problem/6307 最大团转补图的独立集,这样的话只有r[x]<l[y]或者r[y]<l[x],x和y才能连边,所以排序之后乱搞就行了. 需 ...
- HBASE的安装过程及运行HBASE程序的需要配置的内容
HBase安装配置 ①下载压缩包(选择与自己安装的Hadoop版本的兼容版本,见后面附录) 官网下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache/hba ...
- 推荐几款屏幕录制工具(可录制GIF)
我们经常会遇到一些场景,需要你向别人展示一些操作或是效果——例如告诉别人某某软件的配置步骤啊.刚设计出来网站的动画效果怎么样啊.某某电影里面的一个镜头多么经典啊.打得大快人心的NBA绝杀瞬间是怎么回事 ...
- C#使用PrintDocument打印 多页 打印预览
PrintDocument实例所有的订阅事件如下: 创建一个PrintDocument的实例.如下: System.Drawing.Printing.PrintDocument docToPrint ...
- 高级算法设计讲义 Lecture Notes for Advanced Algorithm Design
(Last modification: 2012-12-17) Textbooks: (1) David Williamson, David Shmoys. The Design of Approxi ...