31

画像の操作に精通しています。URL から画像を取得/読み取りますが、URL にはファイル拡張子がありません。次に、画像をローカル ストレージに書き込み/保存したいのですが、画像ファイルの拡張子 (JPG、PNG など) を指定する必要があり、BufferedImage から拡張子を取得できません。

どうすればそれができるのか教えてください。他の方法でもかまいません。

4

4 に答える 4

39

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());
}
于 2012-07-12T07:38:55.900 に答える
5

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;
    }

  }
于 2016-04-21T13:23:18.180 に答える
2

これは、URL オブジェクト (画像) をフィードし、ファイル拡張子を返すことで機能します。

ただし、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;



}
于 2015-10-22T16:43:09.023 に答える