我有一个来自 URL(我公司内部)的 PNG 图像。当我在网络浏览器中导航到该 URL 时,我正确地看到了图像(透明)。我可以从 Chrome 的网络工具中看到,它按预期以图像/png mime 类型返回。我可以将浏览器中的图像保存到本地硬盘驱动器,最终大小约为 32kb。
我编写了一个简单的 Java 程序来拉下图像并以编程方式保存它。保存图片的代码很简单,如下图:
public static void saveImage(String imageUrl, String destinationFile) throws IOException {
URL url = new URL(imageUrl);
InputStream is = url.openStream();
OutputStream os = new FileOutputStream(destinationFile);
byte[] b = new byte[2048];
int length;
while ((length = is.read(b)) != -1) {
os.write(b, 0, length);
}
is.close();
os.close();
}
但是,每当我运行此程序时,保存的图像都会失真。除了失去透明度之外,它最终看起来大致相同。它的大小只有大约 4kb。除此之外,只看字节我可以看到前 3 个字节是“GIF”。
任何人都可以帮助我了解导致差异的原因吗?
(注意:我在这两种情况下使用的图像 URL 实际上都指向一个 Java Web 应用程序,该应用程序使用 ImageIO.read 从真实图像 URL 返回一个 BufferedImage。
@RequestMapping(value="/{id}", method={RequestMethod.GET,RequestMethod.POST})
public @ResponseBody BufferedImage getImage(@PathVariable String id) {
try {
//Modified slightly to protect the innocent
return ImageIO.read((new URL(IMAGE_URL + id)).openStream());
} catch (IOException io) {
return defaultImage();
}
}
在我的春季上下文文件中,我有:
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="order" value="1" />
<property name="messageConverters">
<list>
<!-- Converter for images -->
<bean class="org.springframework.http.converter.BufferedImageHttpMessageConverter">
<property name="defaultContentType" value="image/png"/>
</bean>
<!-- This must come after our image converter -->
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
</list>
</property>
</bean>
不确定这个额外的层是否会有所作为,但我认为最好提一下。)
任何想法/建议将不胜感激。
谢谢, BJ