2020.02.01_Processingでバーコード自動生成
Yu_Nakaito.icon ディレクトリの定義が必要なので一度プロジェクトデータをどこかに保存してあげてください
code: Barcord_generate.pde
//hah_barcode.pde
//最大文字数(文字の最大値を決めておき、それより少ない文字列はspaceで埋める)
final int n = 5;
//バーコードの大きさ(×2,×4...,×nなど)
final int scale = 2;
//色定義
final color white = color(254, 252, 252), black = color(15, 15, 15);
//ウィンドウサイズ定義
final int w = 320*scale, h = 150*scale;
// 任意の表示テキストを入力(スラッシュで区切る)
final String[] text = {
"t/e/s/t",
"T/E/S/T/!",
"T/H/I/S",
"I/S",
"T/E/space/S/T"
};
//イージング度合い
final float easing = 0.2;
//表示するバーコードのカウント
int textCount = 1;
//バーコードがアニメーション中かどうか
boolean isMoveBarcode = false;
//パターン一覧用の変数
Table code_pattern;
void settings() {
size(w, h);
noSmooth();
}
void setup() {
noStroke();
code_pattern = loadTable("code_pattern.csv");
}
void draw() {
background(white);
}
//キーを押すとアニメーションします
void keyPressed() {
textCount++;
isMoveBarcode = !isMoveBarcode;
}
//現パターンと、変化後のパターン用の変数
float[] patterns;
float[] patterns_next;
float count;
//バーコード
void drawBarcode(String t, String tNext) {
//アニメーション待機時
if (!isMoveBarcode) {
patterns = generatePattern(t);
patterns_next = generatePattern(tNext);
count = 0;
isMoveBarcode = !isMoveBarcode;
}
//バーコードの長さ、高さを計算
float barcodeWidth = 0;
float barcodeHeight = 30*scale;
for (int i = 0; i < patterns.length; i++) {
barcodeWidth += patternsi*scale; }
pushMatrix();
//中央揃え
translate(w/2 - barcodeWidth/2, h/2-barcodeHeight/2);
//実際の描画
for (int i = 0; i < patterns.length; i++) {
//【追加】patternsiの値にイージングアニメーションを追加します patternsi = patternsi + (patterns_nexti - patternsi)*(easing); if (i % 2 == 0) {
fill(black);
rect(count*scale, 0, patternsi*scale, barcodeHeight); } else {
}
}
popMatrix();
count = 0;
}
float[] generatePattern(String str) {
//チェックディジット計算
int checkdigit = int(code_pattern.getString(104, 0)) * 1;
for (int i = 0; i < decomposeText(str).length; i++) {
checkdigit += int(code_pattern.findRow(decomposeText(str)i, 1).getString(0)) * (i+1); }
checkdigit %= 103;
//スタートコードの追加
String p = code_pattern.getString(104, 2);
//具体値の追加
for (int i = 0; i < decomposeText(str).length; i++) {
p += code_pattern.findRow(decomposeText(str)i, 1).getString(2); }
//チェックディジットの追加
p += code_pattern.findRow(str(checkdigit), 0).getString(2);
//ストップコードの追加
p += code_pattern.getString(106, 2);
//float化して配列に格納
for (int i = 0; i < code.length; i++) {
// 文字列の数字は、"0"が数値48に該当するので注意!!!
codei = p.charAt(i) - 48; }
return code;
}
String[] decomposeText(String str) {
//配列の初期化(n文字分の配列確保, 文字がないとこはスペースで保管)
String[] moji;
for (int i = 0; i < moji.length; i++) {
}
//入力テキスト読み出し(スラッシュで分解し、1文字づつ入れていく)
String[] t0 = str.split("/", 0);
for (int j = 0; j < t0.length; j++) {
}
return moji;
}
hr.icon
バーコードの構造
https://www.keyence.co.jp/Images/ss_codereader_b_mechanism_001_1738526.gif
1. スタートコード(A,B,Cの3パターンがあるが、B固定): ❷①❶②❶④
とりあえずバーコードの「始端」を現すものという認識でOK
3パターンあるのは、規格によるもの
2. 具体値(調べて入力)
6桁の数字パターン × 文字数 ...... バーコードを読み取った時に表示される内容
3. チェックディジット(計算):
6桁の数字パターン ......バーコードが正しいことをある計算方法で確かめる数値
計算方法(モジュラス103)は後述
4. ストップコード(固定値): ❷③❸①❶①❷ - とりあえずバーコードの「終端」を現すものという認識でOK
チェックディジットの計算
code:modulus103
チェックディジット(数値)
= {数値(スタートコード) + 数値(O)*1 + 数値(h)*2 + 数値(!)*3} % 103 ;
//( スタートコード数値{103,104,105} + 1文字目の数値*1 +...+ n文字目の数値*n )を103で割った余り
hr.icon
参考文献
この記事は以下の情報を参考にしました