画像の操作に精通しています。URL から画像を取得/読み取りますが、URL にはファイル拡張子がありません。次に、画像をローカル ストレージに書き込み/保存したいのですが、画像ファイルの拡張子 (JPG、PNG など) を指定する必要があり、BufferedImage から拡張子を取得できません。
どうすればそれができるのか教えてください。他の方法でもかまいません。
画像の操作に精通しています。URL から画像を取得/読み取りますが、URL にはファイル拡張子がありません。次に、画像をローカル ストレージに書き込み/保存したいのですが、画像ファイルの拡張子 (JPG、PNG など) を指定する必要があり、BufferedImage から拡張子を取得できません。
どうすればそれができるのか教えてください。他の方法でもかまいません。
ImageReader.getFormatName()を使用する
ImageIO.getImageReaders(Object input)を使用して、ファイルのイメージ リーダーを取得できます。
私は自分でテストしていませんが、これを試すことができます:
ImageInputStream iis = ImageIO.createImageInputStream(file);
Iterator<ImageReader> imageReaders = ImageIO.getImageReaders(iis);
while (imageReaders.hasNext()) {
ImageReader reader = (ImageReader) imageReaders.next();
System.out.printf("formatName: %s%n", reader.getFormatName());
}
URL から画像を取得する場合、InputStream
. それを使用ImageIO
して画像の種類 (形式) を取得し、次のコードで同時に BufferedImage を作成できます。
public static BufferedImageWrapper getImageAndTypeFromInputStream(InputStream is) {
String format = null;
BufferedImage bufferedimage = null;
try (ImageInputStream iis = ImageIO.createImageInputStream(is);) {
Iterator<ImageReader> readers = ImageIO.getImageReaders(iis);
if (readers.hasNext()) {
ImageReader reader = readers.next();
format = reader.getFormatName();
reader.setInput(iis);
bufferedimage = reader.read(0);
}
} catch (IOException e) {
logger.error("ERROR DETERMINING IMAGE TYPE!!!", e);
}
return new BufferedImageWrapper(format, bufferedimage);
}
public static class BufferedImageWrapper {
private final String imageType;
private final BufferedImage bufferedimage;
/**
* Constructor
*
* @param imageType
* @param bufferedimage
*/
public BufferedImageWrapper(String imageType, BufferedImage bufferedimage) {
this.imageType = imageType;
this.bufferedimage = bufferedimage;
}
public String getImageType() {
return imageType;
}
public BufferedImage getBufferedimage() {
return bufferedimage;
}
}
ただし、Java tmp ディレクトリへの最初のダウンロードが必要であり、ImageReader が画像の種類を収集しようとした後に削除されます。
public String getImageFileExtFromUrl(URL urlObject) throws URISyntaxException, IOException{
System.out.println("IN DOWNLOAD FILE FROM URL METHOD");
String tmpFolder = System.getProperty("java.io.tmpdir");
String tmpFileStr = tmpFolder + "/" + new Date().getTime();
Files.copy(urlObject.openStream(), Paths.get(tmpFileStr), StandardCopyOption.REPLACE_EXISTING);
File download = new File(tmpFileStr);
System.out.println("FILE DOWNLOAD EXISTS: " + download.exists() );
try{
ImageInputStream iis = ImageIO.createImageInputStream(download);
Iterator<ImageReader> iter = ImageIO.getImageReaders(iis);
ImageReader reader = iter.next();
String formatName = reader.getFormatName();
System.out.println("FOUND IMAGE FORMAT :" + formatName);
iis.close();
return formatName;
}catch(Exception e){
e.printStackTrace();
}finally{
Files.delete(Paths.get(tmpFileStr));
}
return null;
}