zxing GitHub地址

QRCoder GitHub地址

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的更多相关文章

  1. [开源]C#二维码生成解析工具,可添加自定义Logo

    二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能存更多的信息,也能表示更多的数据类型:比如:字 ...

  2. [开源]C#二维码生成解析工具,可添加自定义Logo (转)

    二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能存更多的信息,也能表示更多的数据类型:比如:字 ...

  3. C#二维码生成解析

    C#二维码生成解析工具,可添加自定义Logo 二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能 ...

  4. java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例

    java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍   我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream ou ...

  5. Java二维码生成与解码

      基于google zxing 的Java二维码生成与解码   一.添加Maven依赖(解码时需要上传二维码图片,所以需要依赖文件上传包) <!-- google二维码工具 --> &l ...

  6. Java二维码生成与解码工具Zxing使用

    Zxing是Google研发的一款非常好用的开放源代码的二维码生成工具,目前源码托管在github上,源码地址: https://github.com/zxing/zxing 可以看到Zxing库有很 ...

  7. atitit.二维码生成总结java zxing

    atitit.二维码生成总结java zxing #-----zxing类库.. but zxing3.0  的类库core-3.0.jar 需要jdk7 只好zing2.2.jar ..jdk6走o ...

  8. java利用Google Zxing实现 二维码生成与解析

    1.引入zxing 2.使用下面两个类:QRCodeUtil.java和BufferedImageLuminanceSource.java 3.新建单元测试类 复制下面测试代码即可. 1.pom文件中 ...

  9. 谷歌zxing 二维码生成工具

    一.加入maven依赖 <!-- 谷歌zxing 二维码 --> <dependency> <groupId>com.google.zxing</groupI ...

随机推荐

  1. 转载:CreateMutex WaitForSingleObject ReleaseMutex使用

    HANDLE CreateMutex( LPSECURITY_ATTRIBUTES lpMutexAttributes,// BOOL bInitialOwner,  // flag for init ...

  2. EGO V2

    Original EGO: mkdir -p ~/Library/Developer/Xcode/UserData/FontAndColorThemes; cd ~/Library/Developer ...

  3. android导入项目出错之解决办法

    导入android源码后,基本都有错误,R.java也不会自动生成,因为是第一次导入工程,工程有错R.java就不会自动生成了,工程有错误,当然模拟器就不能启动,也就看不到效果.随后网上找各种解决方法 ...

  4. HDu1241 DFS搜索

    #include<iostream> #include<cstring> using namespace std; int a[105][105]; int d[8][2]={ ...

  5. Servlet(生命周期)

    <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" ...

  6. ios 处理内存警告

    iPhone下每个app可用的内存是被限制的,如果一个app使用的内存超过20M,则系统会向该app发送Memory Warning消息.收到此消息后,app必须正确处理,否则可能出错或者出现内存泄露 ...

  7. JS --- 数组循环要用length

    socket.on("receive", function (data) { deviceone.print("返回的数据:"+data) // 发送异常 va ...

  8. ASP.NET Core默认注入方式下如何注入多个实现(多种方式) - sky 胡萝卜星星 - CSDN博客

    原文:ASP.NET Core默认注入方式下如何注入多个实现(多种方式) - sky 胡萝卜星星 - CSDN博客 版权声明:本文为starfd原创文章,转载请标明出处. https://blog.c ...

  9. Linux索引节点(Inode:no space for device)用满导致的一次故障

    问题描写叙述 在storm測试环境集群上上nimbus和supervisor自己主动挂调.重新启动时显示no space for device,也不能创建,加入文件及文件夹,df -h查看 ilesy ...

  10. js中有包装类,java中也有包装类

    new Number() vs Number() What is the difference between new Number() and Number()? I get that new Nu ...