javax.imageioを使用して、Javaで他の多くのpngファイルから1つのpngファイルをプログラムで作成しようとしています。
特に、複数の png 画像を単一の tiff ファイルに変換する方法で概説されている回答を使用しようとしています。
ただし、writeInsert(..)
メソッドを呼び出すと、以下の例外が発生し続けます。
java.lang.UnsupportedOperationException: Unsupported write variant!
at javax.imageio.ImageWriter.unsupported(Unknown Source)
at javax.imageio.ImageWriter.writeInsert(Unknown Source)
が挿入可能かどうかを返すことは理解していcanInsertImage
ますが (このメソッドが false を返すことがわかります)、これを変更する方法がわかりません。
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
public class ImageTest
{
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException
{
ImageOutputStream ios = null;
ImageWriter writer = null;
try
{
String dirName = "C:/png/test";
File dir = new File(dirName);
if (dir.exists() && dir.isDirectory())
{
File[] files = dir.listFiles();
if (null != files && files.length > 0)
{
File outFile = new File("C:/png", "output.png");
ios = ImageIO.createImageOutputStream(outFile);
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("png");
if (null != writers && writers.hasNext())
{
writer = writers.next();
writer.setOutput(ios);
ImageWriteParam param = writer.getDefaultWriteParam();
for (int i = 0; i < files.length; i++)
{
InputStream fis = null;
try
{
fis = new BufferedInputStream(new FileInputStream(files[i]));
BufferedImage image = ImageIO.read(fis);
IIOImage img = new IIOImage(image, null, null);
if (i == 0)
{
writer.write(null, img, param);
}
else
{
writer.writeInsert(-1, img, param);
}
image.flush();
} finally
{
if (null != fis)
{
fis.close();
}
}
}
}
}
}
} catch (Exception e)
{
System.err.println("OOOps: " + e.getMessage() + "\n");
e.printStackTrace();
} finally
{
if (null != ios)
{
ios.close();
}
if (null != writer)
{
writer.dispose();
}
}
}
}