亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java怎么實現識別二維碼圖片功能

發布時間:2022-04-21 17:15:30 來源:億速云 閱讀:454 作者:zzz 欄目:開發技術

本篇內容介紹了“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;
/**
 * 作用:二維碼識別(圖片)
 * 類名:QRCodeUtils
 **/
public class QRCodeUtils {
    /**
     * 解析二維碼,此方法解析一個路徑的二維碼圖片
     * path:圖片路徑
     */
    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;

/**
 * @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) {
        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怎么實現識別二維碼圖片功能”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

定日县| 隆尧县| 通海县| 贵阳市| 黔江区| 宜丰县| 黄梅县| 收藏| 邹平县| 翁牛特旗| 历史| 西乡县| 中山市| 高安市| 阿合奇县| 万山特区| 长春市| 衡山县| 凤翔县| 苏州市| 汨罗市| 招远市| 绵竹市| 石阡县| 盐津县| 梁平县| 蒲江县| 许昌市| 黎川县| 静安区| 厦门市| 肃宁县| 富宁县| 潼南县| 宁都县| 赣榆县| 秦皇岛市| 云阳县| 德安县| 福海县| 南澳县|