運転免許証のデータを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; }