運転免許証のデータをPaSoRi(パソリ)で読み取ると、顔写真がJPEG 2000という形式で保存されていました。JPEG 2000形式の画像データを読み込んで複数形式(JPEG、PNG、BMP、GIF、JPEG 2000)で保存するサンプルを書いてみました。
サンプル実装
package sample.jpeg2000;
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
import com.github.jaiimageio.jpeg2000.J2KImageWriteParam;
import com.github.jaiimageio.jpeg2000.impl.J2KImageWriter;
public class Jpeg2000Sample {
public static void main(String[] args) {
// JPEG 2000形式の画像を読み込む
BufferedImage jp2Image = null;
byte[] bytes = {};
try (InputStream input = new ByteArrayInputStream(bytes)) {
// ファイル
jp2Image = ImageIO.read(new File("jpeg2000.jp2"));
// バイト配列
// jp2Image = ImageIO.read(input);
} catch (IOException e) {
e.printStackTrace();
}
// 各形式に変換して保存
try (ImageOutputStream output = ImageIO.createImageOutputStream(new File("output.jp2"))) {
BufferedImage tmpImage = new BufferedImage(jp2Image.getWidth(), jp2Image.getHeight(), BufferedImage.TYPE_INT_RGB);
tmpImage.createGraphics().drawImage(jp2Image, 0, 0, Color.WHITE, null);
// JPEG
ImageIO.write(tmpImage, "JPEG", new File("output.jpg"));
// PNG
ImageIO.write(tmpImage, "PNG", new File("output.png"));
// BMP
ImageIO.write(tmpImage, "BMP", new File("output.bmp"));
// GIF
ImageIO.write(tmpImage, "GIF", new File("output.gif"));
// JPEG 2000
J2KImageWriter writer = null;
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("JPEG2000");
while (writers.hasNext()) {
ImageWriter iw = writers.next();
if (iw instanceof J2KImageWriter) {
writer = (J2KImageWriter) iw;
break;
}
}
IIOImage ioimage = new IIOImage(jp2Image, null, null);
J2KImageWriteParam param = (J2KImageWriteParam) writer.getDefaultWriteParam();
param.setEncodingRate(1.0); // 圧縮
writer.setOutput(output);
writer.write(null, ioimage, param);
writer.dispose();
tmpImage.flush();
jp2Image.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
「jai-imageio-jpeg2000」を使用しました。Javaのバージョンは11です。
jai-imageio-jpeg2000を依存関係に追加するとJPEG 2000形式の画像ファイルが扱えるようになり、読み込むことができました。
運転免許証の画像データを使用する場合は、コメントアウトしているバイト配列で同様のことができます。
あとはtmpImageへ書き出して、各画像形式で保存していきます。最後のJPEG 2000形式での保存処理はエンコーディングレートを指定して圧縮しています。
Maven
「jai-imageio-jpeg2000」の依存関係を下記のように pom.xml に追加しました。
Just a moment...
<dependency> <groupId>com.github.jai-imageio</groupId> <artifactId>jai-imageio-jpeg2000</artifactId> <version>1.3.0</version> </dependency>
モジュール定義(module-info.java)
モジュール定義に「java.desktop」と「jai.imageio.jpeg2000」を追加しました。
「jai.imageio.jpeg2000」は「Name of automatic module ‘jai.imageio.jpeg2000’ is unstable, it is derived from the module’s file name.」と警告が出てしまいますが、おそらくしょうがないのではと思います。
module sample.jpeg2000 {
requires java.desktop;
requires jai.imageio.jpeg2000;
exports sample.jpeg2000;
}

