文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-30 08:18

关注

本篇内容介绍了“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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯