web浏览器中的图像与Java中的图像之间的差异

web浏览器中的图像与Java中的图像之间的差异,java,spring,spring-mvc,browser,Java,Spring,Spring Mvc,Browser,我有一个来自URL的PNG图像(我公司内部)。当我在web浏览器中导航到该URL时,我可以正确地看到图像(具有透明度)。我可以从Chrome的网络工具中看到,它正以图像/png mime类型的形式回归,正如预期的那样。我可以将图像从浏览器保存到本地硬盘,最终大小约为32kb 我编写了一个简单的Java程序来下拉图像并以编程方式保存它。保存图像代码非常简单,如下所示: public static void saveImage(String imageUrl, String destinat

我有一个来自URL的PNG图像(我公司内部)。当我在web浏览器中导航到该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返回一个BuffereImage

@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();
    }
}
在我的spring上下文文件中,我有:

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

我不确定这额外的一层是否有什么不同,但我认为最好提一下。)

如有任何想法/建议,将不胜感激

谢谢,
B.J.

当您使用ImageIO.read时,您会得到一个BuffereImage对象,它是Java的内部格式,而不是PNG格式。如果你把它写进一个文件,你就是在写内部表示。我有点惊讶它的可读性。

很抱歉,我没有包括额外的Spring代码来澄清。我编辑了我的问题,以反映Spring图像转换器的使用。@Benny chrome和Java应用程序是否触发相同的转换代码。我的猜测是Java应用程序没有设置与chrome相同的所有标题,因此服务器返回不同的数据。