iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java怎么实现识别二维码图片功能
  • 290
分享到

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

2023-06-30 08:06:33 290人浏览 八月长安
摘要

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

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

--结束END--

本文标题: java怎么实现识别二维码图片功能

本文链接: https://www.lsjlt.com/news/327742.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • C++ 生态系统中流行库和框架的贡献指南
    作为 c++++ 开发人员,通过遵循以下步骤即可为流行库和框架做出贡献:选择一个项目并熟悉其代码库。在 issue 跟踪器中寻找适合初学者的问题。创建一个新分支,实现修复并添加测试。提交...
    99+
    2024-05-15
    框架 c++ 流行库 git
  • C++ 生态系统中流行库和框架的社区支持情况
    c++++生态系统中流行库和框架的社区支持情况:boost:活跃的社区提供广泛的文档、教程和讨论区,确保持续的维护和更新。qt:庞大的社区提供丰富的文档、示例和论坛,积极参与开发和维护。...
    99+
    2024-05-15
    生态系统 社区支持 c++ overflow 标准库
  • c++中if elseif使用规则
    c++ 中 if-else if 语句的使用规则为:语法:if (条件1) { // 执行代码块 1} else if (条件 2) { // 执行代码块 2}// ...else ...
    99+
    2024-05-15
    c++
  • c++中的继承怎么写
    继承是一种允许类从现有类派生并访问其成员的强大机制。在 c++ 中,继承类型包括:单继承:一个子类从一个基类继承。多继承:一个子类从多个基类继承。层次继承:多个子类从同一个基类继承。多层...
    99+
    2024-05-15
    c++
  • c++中如何使用类和对象掌握目标
    在 c++ 中创建类和对象:使用 class 关键字定义类,包含数据成员和方法。使用对象名称和类名称创建对象。访问权限包括:公有、受保护和私有。数据成员是类的变量,每个对象拥有自己的副本...
    99+
    2024-05-15
    c++
  • c++中优先级是什么意思
    c++ 中的优先级规则:优先级高的操作符先执行,相同优先级的从左到右执行,括号可改变执行顺序。操作符优先级表包含从最高到最低的优先级列表,其中赋值运算符具有最低优先级。通过了解优先级,可...
    99+
    2024-05-15
    c++
  • c++中a+是什么意思
    c++ 中的 a+ 运算符表示自增运算符,用于将变量递增 1 并将结果存储在同一变量中。语法为 a++,用法包括循环和计数器。它可与后置递增运算符 ++a 交换使用,后者在表达式求值后递...
    99+
    2024-05-15
    c++
  • c++中a.b什么意思
    c++kquote>“a.b”表示对象“a”的成员“b”,用于访问对象成员,可用“对象名.成员名”的语法。它还可以用于访问嵌套成员,如“对象名.嵌套成员名.成员名”的语法。 c++...
    99+
    2024-05-15
    c++
  • C++ 并发编程库的优缺点
    c++++ 提供了多种并发编程库,满足不同场景下的需求。线程库 (std::thread) 易于使用但开销大;异步库 (std::async) 可异步执行任务,但 api 复杂;协程库 ...
    99+
    2024-05-15
    c++ 并发编程
  • 如何在 Golang 中备份数据库?
    在 golang 中备份数据库对于保护数据至关重要。可以使用标准库中的 database/sql 包,或第三方包如 github.com/go-sql-driver/mysql。具体步骤...
    99+
    2024-05-15
    golang 数据库备份 mysql git 标准库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作