日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2021SC@SDUSC Zxing开源代码(十六)PDF417二维码(二)

發(fā)布時間:2023/12/20 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2021SC@SDUSC Zxing开源代码(十六)PDF417二维码(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2021SC@SDUSC

目錄

  • 一、BarcodeMatrix
  • 二、BarcodeRow
  • 三、Compaction
  • 四、Dimensions
  • 五、PDF417ErrorCorrection
  • 六、PDF417HighLevelEncoder


前言:本篇博客繼續(xù)介紹PDF417二維碼的編碼步驟過程。


一、BarcodeMatrix

BarcodeMatrix類以易于訪問的格式保存條形碼的所有信息。
包括以下四個成員變量,分別表示二維碼相應(yīng)的矩陣、當(dāng)前行、二維碼的高和寬。

private final BarcodeRow[] matrix;private int currentRow;private final int height;private final int width;

其構(gòu)造函數(shù)為:
height和width分別為矩陣的高度(行)和寬度(列)。

BarcodeMatrix(int height, int width) {matrix = new BarcodeRow[height];//將數(shù)組初始化為正確的寬度for (int i = 0, matrixLength = matrix.length; i < matrixLength; i++) {matrix[i] = new BarcodeRow((width + 4) * 17 + 1);}this.width = width * 17;this.height = height;this.currentRow = -1;}

二、BarcodeRow

BarcodeRow類用來創(chuàng)建條形碼的行。

其成員變量有:

private final byte[] row;private int currentLocation;

主要方法有:
其中,x表示在條中的位置;black為一個布爾值,如果條為黑色,則為真;如果條為白色,則為假;width表示條寬為多少個點。

set(int x, boolean black) 方法用來設(shè)置欄中的特定位置;addBar(boolean black, int width) 用來添加條。

private void set(int x, boolean black) {row[x] = (byte) (black ? 1 : 0);}void addBar(boolean black, int width) {for (int ii = 0; ii < width; ii++) {set(currentLocation++, black);}}

getScaledRow(int scale)方法用于縮放行,scale 表示縮放圖像的大小,必須大于或等于1;此函數(shù)返回縮放的行。

byte[] getScaledRow(int scale) {byte[] output = new byte[row.length * scale];for (int i = 0; i < output.length; i++) {output[i] = row[i / scale];}return output;}

三、Compaction

Compaction類是一個枚舉類,用來表示可能的PDF417條碼壓縮類型。
一共有四種類型: AUTO、TEXT、BYTE、NUMERIC

public enum Compaction {AUTO,TEXT,BYTE,NUMERIC }

四、Dimensions

Dimensions是數(shù)據(jù)對象,用于指定PDF417條形碼的最小行數(shù)和最大列數(shù)。

四個成員變量分別表示最小列數(shù)、最大列數(shù)、最小行數(shù)、最大行數(shù)。

public final class Dimensions {private final int minCols;private final int maxCols;private final int minRows;private final int maxRows;public Dimensions(int minCols, int maxCols, int minRows, int maxRows) {this.minCols = minCols;this.maxCols = maxCols;this.minRows = minRows;this.maxRows = maxRows;}public int getMinCols() {return minCols;}public int getMaxCols() {return maxCols;}public int getMinRows() {return minRows;}public int getMaxRows() {return maxRows;} }

五、PDF417ErrorCorrection

PDF417ErrorCorrection類為PDF417的糾錯碼,遵循ISO/IEC 15438:2001(E)第4.10章所述算法。

getErrorCorrectionCodewordCount(int errorCorrectionLevel) 用來確定指定糾錯級別的糾錯碼字?jǐn)?shù)。
errorCorrectionLevel 為錯誤更正級別(0-8);
函數(shù)返回為糾錯而生成的碼字?jǐn)?shù)。

static int getErrorCorrectionCodewordCount(int errorCorrectionLevel) {if (errorCorrectionLevel < 0 || errorCorrectionLevel > 8) {throw new IllegalArgumentException("Error correction level must be between 0 and 8!");}return 1 << (errorCorrectionLevel + 1);}

getRecommendedMinimumErrorCorrectionLevel(int n)函數(shù)返回ISO/IEC 15438:2001(E)附錄E中所述的建議最小錯誤糾正水平。
n 為數(shù)據(jù)碼字的數(shù)量。

static int getRecommendedMinimumErrorCorrectionLevel(int n) throws WriterException {if (n <= 0) {throw new IllegalArgumentException("n must be > 0");}if (n <= 40) {return 2;}if (n <= 160) {return 3;}if (n <= 320) {return 4;}if (n <= 863) {return 5;}throw new WriterException("No recommendation possible");}

generateErrorCorrection(CharSequence dataCodewords, int errorCorrectionLevel)函數(shù)根據(jù)ISO/IEC 15438:2001(E)中的4.10生成糾錯碼字。
dataCodewords 為數(shù)據(jù)碼字?jǐn)?shù)據(jù)碼字;errorCorrectionLevel 為錯誤更正級別(0-8)。

static String generateErrorCorrection(CharSequence dataCodewords, int errorCorrectionLevel) {int k = getErrorCorrectionCodewordCount(errorCorrectionLevel);char[] e = new char[k];int sld = dataCodewords.length();for (int i = 0; i < sld; i++) {int t1 = (dataCodewords.charAt(i) + e[e.length - 1]) % 929;int t2;int t3;for (int j = k - 1; j >= 1; j--) {t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][j]) % 929;t3 = 929 - t2;e[j] = (char) ((e[j - 1] + t3) % 929);}t2 = (t1 * EC_COEFFICIENTS[errorCorrectionLevel][0]) % 929;t3 = 929 - t2;e[0] = (char) (t3 % 929);}StringBuilder sb = new StringBuilder(k);for (int j = k - 1; j >= 0; j--) {if (e[j] != 0) {e[j] = (char) (929 - e[j]);}sb.append(e[j]);}return sb.toString();}

六、PDF417HighLevelEncoder

PDF417HighLevelEncoder類為PDF417的高級編碼器。

含有多個成員變量。

成員變量取值說明
TEXT_COMPACTION0文本壓縮代碼
BYTE_COMPACTION1字節(jié)壓縮代碼
NUMERIC_COMPACTION2數(shù)字壓縮代碼
SUBMODE_ALPHA0文本壓縮子模式Alpha
SUBMODE_LOWER1文本壓縮子模式下
SUBMODE_MIXED2文本壓縮子模式混合
SUBMODE_PUNCTUATION3文本壓縮子模式標(biāo)點符號
LATCH_TO_TEXT900模式鎖存到文本壓縮模式
LATCH_TO_BYTE_PADDED901模式鎖存到字節(jié)壓縮模式(字符數(shù)不是6的倍數(shù))
LATCH_TO_NUMERIC902模式鎖存到數(shù)字壓縮模式
SHIFT_TO_BYTE913模式轉(zhuǎn)換為字節(jié)壓縮模式
LATCH_TO_BYTE924模式鎖存到字節(jié)壓縮模式(字符數(shù)為6的倍數(shù))
ECI_USER_DEFINED925用戶定義擴展信道解釋(ECI)的標(biāo)識符
ECI_GENERAL_PURPOSE926通用ECO格式的標(biāo)識符
ECI_CHARSET927代碼頁字符集的ECI標(biāo)識符
TEXT_MIXED_RAW文本壓縮混合子模式的原始代碼表
TEXT_PUNCTUATION_RAW文本壓縮的原始代碼表:標(biāo)點子模式

成員函數(shù)為:

成員函數(shù)說明
encodeHighLevel(String msg, Compaction compaction, Charset encoding)使用ISO/IEC 15438:2001(E)附錄P中描述的算法對PDF417消息執(zhí)行高級編碼。如果已選擇字節(jié)壓縮,則僅使用字節(jié)壓縮。返回編碼消息(字符值范圍從0到928)
encodeText(CharSequence msg, int startpos,int count,StringBuilder sb, int initialSubmode)使用文本壓縮對部分信息進行編碼。返回此方法結(jié)束時的文本子模式
encodeBinary(byte[] bytes, int startpos,int count,int startmode,StringBuilder sb)使用字節(jié)壓縮對部分信息進行編碼。Unicode字符將使用cp437代碼頁轉(zhuǎn)換為二進制。返回接收編碼的碼字。
determineConsecutiveDigitCount(CharSequence msg, int startpos)確定可使用數(shù)字壓縮編碼的連續(xù)字符數(shù)。返回請求的字符數(shù)。
determineConsecutiveTextCount(CharSequence msg, int startpos)確定可使用文本壓縮編碼的連續(xù)字符數(shù)。返回請求的字符數(shù)。
determineConsecutiveBinaryCount(String msg, int startpos, Charset encoding)確定可使用二進制壓縮編碼的連續(xù)字符數(shù)。返回請求的字符數(shù)。

總結(jié)

以上是生活随笔為你收集整理的2021SC@SDUSC Zxing开源代码(十六)PDF417二维码(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。