Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Java中的URL获取图像格式?_Java_Image_Image Processing_Bufferedimage_Javax.imageio - Fatal编程技术网

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

如何从Java中的URL获取图像格式?,java,image,image-processing,bufferedimage,javax.imageio,Java,Image,Image Processing,Bufferedimage,Javax.imageio,我从一个没有扩展名(jpg、gif、png等)的url获取了一个图像 我下载图像没有问题 BufferedImage image = null; URL url = new URL(link); image = ImageIO.read(url); 但是,在保存到磁盘之前,我想知道文件的扩展名。我尝试了以下和ImageIO.createImageInputStream(image)总是返回null ImageInputStream iis = ImageIO.createImageInputS

我从一个没有扩展名(jpg、gif、png等)的url获取了一个图像

我下载图像没有问题

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

任何建议都将不胜感激。

在Java 7+中,您现在只需使用即可

探测文件的内容类型

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

Java虚拟机的给定调用维护系统范围的 文件类型检测器列表。已加载已安装的文件类型检测器 使用 ServiceLoader类。已安装的文件类型检测器使用 系统类加载器。如果找不到系统类加载器 然后使用扩展类加载器;如果扩展类装入器 找不到,则使用引导类装入器。文件类型 探测器的安装通常是通过将它们放在 应用程序类路径或扩展目录中的JAR文件 包含名为的提供程序配置文件 资源目录中的java.nio.file.spi.FileTypeDetector META-INF/services,该文件列出一个或多个完全限定的 FileTypeDetector的具有零 参数构造函数。如果查找或实例化 安装的文件类型检测器失败,则会出现未指定的错误 扔。已安装的提供商所处的订购是 具体实施

此方法的返回值是 由定义的多用途Internet邮件扩展(MIME)内容类型 RFC 2045:多用途Internet邮件扩展(MIME)第一部分: 互联网信息正文的格式。这根绳子保证是安全的 可根据RFC中的语法进行分析


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

您需要从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];
        }
    }
}

但是您仍然需要ImageIO提供程序才能从MIME类型获得扩展。

谢谢您的回答,我想您已经理解了。但是,我尝试获取路径,并使用了以下代码。Path=Path.get(url.toURI());但是,它正在抛出FileSystemNotFoundException:未安装提供程序“http”。我得到的路径对象正确吗?再次感谢。您使用的路径库是什么?我似乎没有看到path.getPath方法。仅路径。get()方法。我看到这两个类的包java.nio.file。我使用的是JDK 1.8我知道你提到过Java 7,但我认为它也适用于Java 8.Paths。getPath只适用于'file:'URI(以及基于zip文件系统等文件系统的URI)。“为了下载文件并保存到磁盘,我必须提到文件类型”这个假设是错误的,是的,你让事情复杂化了。将文件保存到临时路径,并使用
Files.probeContentType(path)。
检查所需的图像格式。它是
ImageIO.createImageInputStream(url)
(即不是
image
)。如果您只想保存到磁盘,则无需读取映像。非常感谢@VGR。这就是我要找的。一个简单的问题是:String contentType=conn.getContentType();这已经给了我image/png。在这个阶段停止还不够吗?不。子类型(在
/
之后的部分)不能保证与扩展相同。考虑“图像/JPEG”和“图像/SVG+XML”。还有一些服务器在内容类型上撒谎(即错误配置,或者依赖于文件扩展,这可能是不正确的)。因此,您不能盲目信任内容类型。查看实际有效负载,如
文件。probeContentType(..)
这样做更安全。
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 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);