java 简单快速的生成二维码(带图片),图片识别代码java

  java 简单快速的生成二维码(带图片),图片识别代码java

  本文实例为大家分享了爪哇岛实现识别二维码图片功能,供大家参考,具体内容如下

  所需专家依赖

  依赖性groupIdcom.google.zxing/groupId Java se/artifact id版本3 .2 .1/版本/依赖性依赖性groupIdcom.google.zxing/groupId工艺Id核心/工艺Id版本3 .3 .3/版本/依赖性实现的爪哇岛类

  导入com。谷歌。zxing。*;导入com。谷歌。zxing。客户。J2SE。bufferedimageluminancesource导入com。谷歌。zxing。常见。混合二进制er;导入星期日misc . base 64解码器;导入javax。imageio。imageio导入Java。awt。形象。缓冲图像;导入Java。io。bytearray inputstream导入Java。io。文件;导入Java。io。io异常;导入Java。util。hashmap导入Java。util。地图;/*** 作用:二维码识别(图片)* 类名:QR codeutils * */公共类QRCodeUtils { /** *解析二维码,此方法解析一个路径的二维码图片*路径:图片路径*/公共静态字符串deEncodeByPath(String path){ String content=null;图片图像;请尝试{ image=ImageIO.read(新文件(路径));luminance source source=new buffered image luminance source(image);binary izer binary izer=新的混合二进制izer(源码);二进制位图二进制位图=新二进制位图(二进制化器);MapDecodeHintType,Object hints=new HashMapDecodeHintType,Object();提示. put(DecodeHintType .CHARACTER_SET,‘UTF-8’);结果结果=新的多种形式的踏板().解码(二进制位图,提示);//解码System.out.println(图片中内容: );系统。出去。println( content:结果。gettext());内容=结果。gettext();} catch(io异常e){ e . printstacktrace();} catch (NotFoundException e) { //这里判断如果识别不了带标志;徽标的图片,重新添加上一个属性请尝试{ image=ImageIO.read(新文件(路径));luminance source source=new buffered image luminance source(image);binary izer binary izer=新的混合二进制izer(源码);二进制位图二进制位图=新二进制位图(二进制化器);MapDecodeHintType,Object hints=new HashMapDecodeHintType,

   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;/** * @author weijianxing * @description: TODO * @date 2020/11/26 9:28 */public class ImageOptimizationUtil {    // 阈值0-255    public static int YZ = 150;    /**     * 图像二值化处理     *     * @param filePath 要处理的图片路径     * @param fileOutputPath 处理后的图片输出路径     */    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));    }    /**     * 图像的灰度处理     * 利用浮点算法:Gray = R*0.3 + G*0.59 + B*0.11;     *     * @param rgb 该点的RGB值     * @return 返回处理后的灰度值     */    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;    }    /**     * 自己加周围8个灰度值再除以9,算出其相对灰度值     *     * @param gray     * @param x 要计算灰度的点的横坐标     * @param y 要计算灰度的点的纵坐标     * @param w 图像的宽度     * @param h 图像的高度     * @return     */    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;    }    /**     * 二值化后的图像的开运算:先腐蚀再膨胀(用于去除图像的小黑点)     *     * @param filePath 要处理的图片路径     * @param fileOutputPath 处理后的图片输出路径     * @throws IOException     */    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++) {                /*                 * 为0表示改点和周围8个点都是黑,则该点腐蚀操作后为黑                 * 由于公司图片态模糊,完全达到9个点全为黑的点太少,最后效果很差,故改为了小于30                 * (写30的原因是,当只有一个点为白,即总共255,调用getGray方法后得到255/9 = 28)                 */                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) {        Str      

	  
	  
	  
	  
	  
	  
        

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: