JPEG 2000形式の画像を読み込んでいろいろな形式で保存

Java

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

タイトルとURLをコピーしました