如何从Java中的URL获取图像格式?

时间:2015-05-01 18:57:59

标签: java image image-processing bufferedimage javax.imageio

我有一个图片,我从没有扩展名的网址(jpg,gif,png等)中获取。

下载图片没问题。

BufferedImage image = null;
URL url = new URL(link);
image = ImageIO.read(url);

但是,我想在保存到磁盘之前知道文件的扩展名。我尝试了以下操作, ImageIO.createImageInputStream(image); 始终返回null。

ImageInputStream iis = ImageIO.createImageInputStream(image);
//where image is BufferImage but it is always returning null.

while (imageReaders.hasNext()) {
    ImageReader reader = imageReaders.next();
    System.out.printf("formatName: %s%n", reader.getFormatName());

    return ImageFormatTypes.valueOf(reader.getFormatName());
}

任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分:4)

创建java.awt.Image后,没有格式。它不是PNG,它不是JPEG,它只是一个Java Image。因此,您无法从Image对象中获取图像格式。

您需要从URL获取它。最可靠的方法是检查URL的内容类型,然后从ImageIO提供程序获取扩展名:

URL url = new URL(link);
URLConnection conn = url.openConnection();
String contentType = conn.getContentType();

String suffix = null;
Iterator<ImageReader> readers =
    ImageIO.getImageReadersByMIMEType(contentType);
while (suffix == null && readers.hasNext()) {
    ImageReaderSpi provider = readers.next().getOriginatingProvider();
    if (provider != null) {
        String[] suffixes = provider.getFileSuffixes();
        if (suffixes != null) {
            suffix = suffixes[0];
        }
    }
}

您还可以将URL保存到临时文件,这样就可以在其上使用Files.probeContentType:

URL url = new URL(link);
Path imageFile = Files.createTempFile("image", null);
try (InputStream stream = url.openStream()) {
    Files.copy(stream, imageFile, StandardCopyOption.REPLACE_EXISTING);
}

image = ImageIO.read(imageFile.toFile());
String contentType = Files.probeContentType(imageFile);
Files.delete(imageFile);

但是你仍然需要ImageIO提供者从MIME类型获得扩展。

答案 1 :(得分:3)

在Java 7+中,您现在可以使用Files.probeContentType(path)

----------
public static String probeContentType(Path path)
                               throws IOException
  

探测文件的内容类型。

     

此方法使用已安装的FileTypeDetector实现   探测给定文件以确定其内容类型。每种文件类型   反过来,调用检测器的probeContentType来探测文件   类型。如果文件被识别,则返回内容类型。如果   任何已安装的文件类型检测器都无法识别该文件   然后调用系统默认文件类型检测器来猜测   内容类型。

     

Java虚拟机的给定调用维护系统范围   文件类型检测器列表。已加载已安装的文件类型检测器   使用由...定义的服务提供者加载工具   ServiceLoader类。使用安装的文件类型检测器   系统类加载器。如果找不到系统类加载器   然后使用扩展类加载器;如果是扩展类加载器   无法找到然后使用bootstrap类加载器。文件类型   通常通过将探测器放置在探测器上的JAR文件中来安装探测器   应用程序类路径或扩展目录中的JAR文件   包含名为的provider-configuration文件   资源目录中的java.nio.file.spi.FileTypeDetector   META-INF / services,文件列出一个或多个完全限定的   FileTypeDetector的具体子类的名称为零   参数构造函数。如果找到或实例化的过程   安装的文件类型检测器失败然后出现未指定的错误   抛出。安装提供程序所在的顺序是   具体实施。

     

此方法的返回值是a值的字符串形式   多用途Internet邮件扩展(MIME)内容类型,由   RFC 2045:多用途Internet邮件扩展(MIME)第一部分:   互联网信息机构的格式。保证字符串   可以根据RFC中的语法进行解析。