我的编程空间,编程开发者的网络收藏夹
学习永远不晚

java怎么实现识别二维码图片功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

java怎么实现识别二维码图片功能

本篇内容介绍了“java怎么实现识别二维码图片功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

所需maven依赖

<dependency>   <groupId>com.google.zxing</groupId>   <artifactId>javase</artifactId>   <version>3.2.1</version></dependency><dependency>    <groupId>com.google.zxing</groupId>    <artifactId>core</artifactId>    <version>3.3.3</version></dependency>

实现的java类

import com.google.zxing.*;import com.google.zxing.client.j2se.BufferedImageLuminanceSource;import com.google.zxing.common.HybridBinarizer;import sun.misc.BASE64Decoder; import javax.imageio.ImageIO;import java.awt.image.BufferedImage;import java.io.ByteArrayInputStream;import java.io.File;import java.io.IOException;import java.util.HashMap;import java.util.Map;public class QRCodeUtils {        public static String deEncodeByPath(String path) {        String content = null;        BufferedImage image;        try {            image = ImageIO.read(new File(path));            LuminanceSource source = new BufferedImageLuminanceSource(image);            Binarizer binarizer = new HybridBinarizer(source);            BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);            Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();            hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");            Result result = new MultiFormatReader().decode(binaryBitmap, hints);//解码            System.out.println("图片中内容:  ");            System.out.println("content: " + result.getText());            content = result.getText();        } catch (IOException e) {            e.printStackTrace();        } catch (NotFoundException e) {            //这里判断如果识别不了带LOGO的图片,重新添加上一个属性            try {                image = ImageIO.read(new File(path));                LuminanceSource source = new BufferedImageLuminanceSource(image);                Binarizer binarizer = new HybridBinarizer(source);                BinaryBitmap binaryBitmap = new BinaryBitmap(binarizer);                Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();                //设置编码格式                hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");                //设置优化精度                hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);                //设置复杂模式开启(我使用这种方式就可以识别微信的二维码了)                hints.put(DecodeHintType.PURE_BARCODE,Boolean.TYPE);                Result result = new MultiFormatReader().decode(binaryBitmap, hints);//解码                System.out.println("图片中内容:  ");                System.out.println("content: " + result.getText());                content = result.getText();            } catch (IOException e) {                e.printStackTrace();            } catch (NotFoundException e) {                e.printStackTrace();            }        }        return content;    }}

测试

public static void main(String [] args){    deEncodeByPath("D:\\Users/admin/Desktop/erweima/timg (5).jpg");//二维码图片路径}

输出结果:

图片中内容:
content: http://qrcode.online

如果上述不能识别的话,那么就需要对图片处理一次,然后再进行识别,这里是个调优图片的工具类。

package com.face.ele.common.utils;import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;public class ImageOptimizationUtil {    // 阈值0-255    public static int YZ = 150;        public static void binarization(String filePath, String fileOutputPath) throws IOException {        File file = new File(filePath);        BufferedImage bi = ImageIO.read(file);        // 获取当前图片的高,宽,ARGB        int h = bi.getHeight();        int w = bi.getWidth();        int arr[][] = new int[w][h];        // 获取图片每一像素点的灰度值        for (int i = 0; i < w; i++) {            for (int j = 0; j < h; j++) {                // getRGB()返回默认的RGB颜色模型(十进制)                arr[i][j] = getImageGray(bi.getRGB(i, j));// 该点的灰度值            }        }        // 构造一个类型为预定义图像类型,BufferedImage        BufferedImage bufferedImage = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_BINARY);        // 和预先设置的阈值大小进行比较,大的就显示为255即白色,小的就显示为0即黑色        for (int i = 0; i < w; i++) {            for (int j = 0; j < h; j++) {                if (getGray(arr, i, j, w, h) > YZ) {                    int white = new Color(255, 255, 255).getRGB();                    bufferedImage.setRGB(i, j, white);                } else {                    int black = new Color(0, 0, 0).getRGB();                    bufferedImage.setRGB(i, j, black);                }            }        }        ImageIO.write(bufferedImage, "jpg", new File(fileOutputPath));    }        private static int getImageGray(int rgb) {        String argb = Integer.toHexString(rgb);// 将十进制的颜色值转为十六进制        // argb分别代表透明,红,绿,蓝 分别占16进制2位        int r = Integer.parseInt(argb.substring(2, 4), 16);// 后面参数为使用进制        int g = Integer.parseInt(argb.substring(4, 6), 16);        int b = Integer.parseInt(argb.substring(6, 8), 16);        int gray = (int) (r*0.28 + g*0.95 + b*0.11);        return gray;    }        public static int getGray(int gray[][], int x, int y, int w, int h) {        int rs = gray[x][y] + (x == 0 ? 255 : gray[x - 1][y]) + (x == 0 || y == 0 ? 255 : gray[x - 1][y - 1])                + (x == 0 || y == h - 1 ? 255 : gray[x - 1][y + 1]) + (y == 0 ? 255 : gray[x][y - 1])                + (y == h - 1 ? 255 : gray[x][y + 1]) + (x == w - 1 ? 255 : gray[x + 1][y])                + (x == w - 1 || y == 0 ? 255 : gray[x + 1][y - 1])                + (x == w - 1 || y == h - 1 ? 255 : gray[x + 1][y + 1]);        return rs / 9;    }        public static void opening(String filePath, String fileOutputPath) throws IOException {        File file = new File(filePath);        BufferedImage bi = ImageIO.read(file);        // 获取当前图片的高,宽,ARGB        int h = bi.getHeight();        int w = bi.getWidth();        int arr[][] = new int[w][h];        // 获取图片每一像素点的灰度值        for (int i = 0; i < w; i++) {            for (int j = 0; j < h; j++) {                // getRGB()返回默认的RGB颜色模型(十进制)                arr[i][j] = getImageGray(bi.getRGB(i, j));// 该点的灰度值            }        }        int black = new Color(0, 0, 0).getRGB();        int white = new Color(255, 255, 255).getRGB();        BufferedImage bufferedImage = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_BINARY);        // 临时存储腐蚀后的各个点的亮度        int temp[][] = new int[w][h];        // 1.先进行腐蚀操作        for (int i = 0; i < w; i++) {            for (int j = 0; j < h; j++) {                                if (getGray(arr, i, j, w, h) < 30) {                    temp[i][j] = 0;                } else{                    temp[i][j] = 255;                }            }        }        // 2.再进行膨胀操作        for (int i = 0; i < w; i++) {            for (int j = 0; j < h; j++) {                bufferedImage.setRGB(i, j, white);            }        }        for (int i = 0; i < w; i++) {            for (int j = 0; j < h; j++) {                // 为0表示改点和周围8个点都是黑,则该点腐蚀操作后为黑                if (temp[i][j] == 0) {                    bufferedImage.setRGB(i, j, black);                    if(i > 0) {                        bufferedImage.setRGB(i-1, j, black);                    }                    if (j > 0) {                        bufferedImage.setRGB(i, j-1, black);                    }                    if (i > 0 && j > 0) {                        bufferedImage.setRGB(i-1, j-1, black);                    }                    if (j < h-1) {                        bufferedImage.setRGB(i, j+1, black);                    }                    if (i < w-1) {                        bufferedImage.setRGB(i+1, j, black);                    }                    if (i < w-1 && j > 0) {                        bufferedImage.setRGB(i+1, j-1, black);                    }                    if (i < w-1 && j < h-1) {                        bufferedImage.setRGB(i+1, j+1, black);                    }                    if (i > 0 && j < h-1) {                        bufferedImage.setRGB(i-1, j+1, black);                    }                }            }        }        ImageIO.write(bufferedImage, "jpg", new File(fileOutputPath));    }    public static void main(String[] args) {        String fullPath="E:\\weijianxing\\img\\微信图片_20201202160240.jpg";        String newPath="E:\\weijianxing\\img\\1new_微信图片_20201202160240.jpg";        try {            ImageOptimizationUtil.binarization(fullPath,newPath);        } catch (IOException e) {            e.printStackTrace();        }    }}

可以手动测试,然后对改代码的部分进行调正对应的参数-- gray变量里的计算进行灰度调整

private static int getImageGray(int rgb) {        String argb = Integer.toHexString(rgb);// 将十进制的颜色值转为十六进制        // argb分别代表透明,红,绿,蓝 分别占16进制2位        int r = Integer.parseInt(argb.substring(2, 4), 16);// 后面参数为使用进制        int g = Integer.parseInt(argb.substring(4, 6), 16);        int b = Integer.parseInt(argb.substring(6, 8), 16);        int gray = (int) (r*0.28 + g*0.95 + b*0.11);        return gray;    }

等调整之后,在对图片进行识别即可。

“java怎么实现识别二维码图片功能”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

java怎么实现识别二维码图片功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java怎么实现识别二维码图片功能

本篇内容介绍了“java怎么实现识别二维码图片功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!所需maven依赖
2023-06-30

java实现识别二维码图片功能方法详解与实例源码

这篇文章主要介绍了java实现识别二维码图片,java无法识别二维码情况下对二维码图片调优功能方法与实例源码,需要的朋友可以参考下
2022-12-10

Android中怎么实现图片识别功能

本篇文章为大家展示了Android中怎么实现图片识别功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1、界面我采用了一个SurfaceView用来显示摄像头的预览画面,重写了一个SurfaceVi
2023-05-30

Java中怎么实现生成二维码功能

今天就跟大家聊聊有关Java中怎么实现生成二维码功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。maven依赖
2023-06-15

Android中怎么实现一个图片文字识别功能

Android中怎么实现一个图片文字识别功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、添加依赖implementation com.rmtheis:tess-two
2023-06-20

c++图像识别功能怎么实现

要实现C++图像识别功能,你可以使用图像处理库和机器学习库来完成。以下是一种可能的实现方法:安装和配置OpenCV库:OpenCV是一个广泛使用的开源计算机视觉库,可以提供图像处理和计算机视觉算法。你需要下载和安装OpenCV,并配置C++
2023-10-24

Android平台生成二维码并实现扫描 &amp; 识别功能

1.二维码的前世今生“二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比
2022-06-06

Android中怎么实现二维码扫描功能

这期内容当中小编将会给大家带来有关Android中怎么实现二维码扫描功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1 开发准备1.1 android studio 安装  这里就不
2023-06-04

java怎么使用tess4j进行图片文字识别功能

这篇文章主要介绍“java怎么使用tess4j进行图片文字识别功能”,在日常操作中,相信很多人在java怎么使用tess4j进行图片文字识别功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java怎么使用t
2023-07-05

Java怎么创建或识别条形码和二维码

本篇内容主要讲解“Java怎么创建或识别条形码和二维码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么创建或识别条形码和二维码”吧!使用工具:Free Spire.Barcode fo
2023-06-02

java zxing怎么合成复杂二维码图片

本篇内容介绍了“java zxing怎么合成复杂二维码图片”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!整体思路:引入zxing成熟的二维码
2023-06-30

C#怎么实现将网址生成二维码图片

这篇文章主要介绍“C#怎么实现将网址生成二维码图片”,在日常操作中,相信很多人在C#怎么实现将网址生成二维码图片问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#怎么实现将网址生成二维码图片”的疑惑有所帮助!
2023-06-30

Python+Selenium+Pytesseract怎么实现图片验证码识别

这篇文章给大家介绍Python+Selenium+Pytesseract怎么实现图片验证码识别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、selenium截取验证码import jsonfrom io impor
2023-06-26

java人脸识别考勤功能怎么实现

Java人脸识别考勤功能的实现需要以下步骤:1.采集人脸数据:使用摄像头或者照片采集人脸数据,保存到数据库中。2.预处理人脸数据:对采集的人脸数据进行预处理,包括人脸检测、对齐、归一化等操作,以便于后续的识别。3.训练模型:使用机器学习算法
2023-05-30

基于Tensorflow的图像识别功能怎么实现

要实现基于Tensorflow的图像识别功能,可以按照以下步骤进行:准备数据集:首先需要准备包含标记好的图像数据集,这些数据将用于训练模型和测试模型的准确性。构建模型:使用Tensorflow构建一个卷积神经网络(CNN)模型,CNN是图像
基于Tensorflow的图像识别功能怎么实现
2024-04-03

Android 中怎么实现点击生成二维码功能

这期内容当中小编将会给大家带来有关Android 中怎么实现点击生成二维码功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。QRCodeUtil:package com.example.administr
2023-05-30

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录