ISBNコード(EAN13/JAN)をJavaで画像出力する

今回はJavaに文字列を引き渡しISBNコードを画像出力します。

早速、各種バーコードを取り扱うZXingライブラリを利用します。

// https://mvnrepository.com/artifact/com.google.zxing/core
compile group: 'com.google.zxing', name: 'core', version: '3.3.2'
// https://mvnrepository.com/artifact/com.google.zxing/javase
compile group: 'com.google.zxing', name: 'javase', version: '3.3.2'

下記がEAN13/JANを出力するコード例です。

makeEAN13に12桁の文字列を渡す事で、プロジェクト内に画像を出力してくれます。

13桁でも大丈夫ですが、最終桁のチェックサムが間違っているとエラーを起こします。(ちゃんと計算してくれているのですね)

void makeEAN13(String code){
EAN13Writer ean13Writer = new EAN13Writer();
try {
BitMatrix bitMatrix = ean13Writer.encode(code, BarcodeFormat.EAN_13, width, height);
BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
ImageIO.write(image, image_format, new File("barcode.png"));
}catch(IOException | WriterException e){
e.printStackTrace();
}
}

※出力されたコード

ISBN、EAN13、JANなどなど詳しい情報は別途調べて戴ければと思います。

Minecraft Mod – WideRangeFire(for v1.9~v1.12)

このModについて 

WideRangeFireは既存の火ブロックの動作を書き換えて、延焼を加速させます。

使い方

  • 前提ModはForge。
  • Minecraftのバージョンにあったページ下にあるjarファイルをmodsフォルダに突っ込めば動作するはずです。

主な火ブロックの変更点

  • 草ブロックを延焼対象になりました。(燃え尽きると土ブロックに代わります)
  • 延焼範囲が周囲1ブロックから2ブロックになりました。
    https://minecraft-ja.gamepedia.com/%E7%82%8E
  • いくつかのブロックの可燃性/延焼率が上がっています。
  • 草ブロックの他、蜘蛛の巣、小麦が燃えます。

注意点

  • 延焼範囲が広くなった分、動作が重くなっています。
  • 結構な速度で燃え広がりますので破壊系Modと思ってください

ダウンロードは下記からお願いします。

WideRangeFire-1.9

WideRangeFire-1.9.4

WideRangeFire-1.10.2

WideRangeFire-1.11

WideRangeFire-1.12

Java(RXTX)からSD120(バーコードリーダー)を利用する

こちらの記事にて事前にシリアル通信の準備を済ましておきます。

build.gradleにて下記を記述してライブラリを追加してあげます。

// https://mvnrepository.com/artifact/org.rxtx/rxtx
compile group: 'org.rxtx', name: 'rxtx', version: '2.1.7'

次に下記のリンクから自分のOSにあったファイルを選択します。

http://fizzed.com/oss/rxtx-for-java

zipを解凍後、中のReadMeを読んでファイルを設置していきます。

Windowsならば下記の通りです。

Copy RXTXcomm.jar —> <JAVA_HOME>\jre\lib\ext
Copy rxtxSerial.dll —> <JAVA_HOME>\jre\bin
Copy rxtxParallel.dll —> <JAVA_HOME>\jre\bin

正しく設定しないとjava.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.pathが発生しますので気を付けましょう。

 

私の場合、下記の様にSerial.javaを作成しました。

package net.kagamikarasu.barcodereader;
import gnu.io.*;
import java.io.IOException;
import java.io.InputStream;
class Serial {
SerialPort port;
Serial(){
try {
CommPort commPort = CommPortIdentifier.getPortIdentifier("COM4").open("hoge", 2000);
port = (SerialPort) commPort;
port.setSerialPortParams(
9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
read();
}catch(Exception ignored){
}
}
private void read() throws IOException {
InputStream in = port.getInputStream();
StringBuilder stringBuilder = new StringBuilder();
byte[] buffer = new byte[1024];
while (true) {
int numRead = in.read(buffer);
if (numRead == -1) {
break;
} else if (numRead == 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
for(byte buf : buffer) {
if (!(buf == 0 || buf == 13))
stringBuilder.append((char) buf);
}
System.out.println(stringBuilder.toString());
stringBuilder.delete(0,stringBuilder.length());
buffer = cleanBytes(buffer);
}
}
private byte[] cleanBytes(byte[] oldByte){
return new byte[oldByte.length];
}
}

ASCII文字しか認識しないと想定していますので、StringBuilderにappendする時はbyte配列を全部読み込んで、各々をcharでやっています。

また、ASCII番号0は無視、13は復帰(改行)ですがバーコードリーダーの設定をいじるのも面倒だったので、こちら側に無視するようにしました。

エラーが起きなく、リーダーにて読み込めば上記の様になるのではないかと思います。

にしても、Native LibとJava Libのバージョン違いますね…