我有一个图片,我从没有扩展名的网址(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());
}
任何建议都将受到赞赏。
答案 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中的语法进行解析。