java - Web 浏览器中的图像与 Java 中的图像之间的区别

标签 java spring spring-mvc browser

我有一个来自 URL(我公司内部)的 PNG 图像。当我在网络浏览器中导航到该 URL 时,我可以正确地看到图像(透明)。我可以从 Chrome 的网络工具中看到它按预期作为 image/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 网络应用程序,它使用 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();
    }
}

在我的 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 时,您会得到一个 BufferedImage 对象,它是 Java 的内部格式,而不是 PNG 格式。如果你把它写到一个文件中,你就是在写那个内部表示。我有点惊讶它的可读性。

关于java - Web 浏览器中的图像与 Java 中的图像之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15618368/

相关文章:

java.lang.NoClassDefFoundError : Could not initialize class org. springframework.beans.CachedIntrospectionResults 问题

spring - 构建可扩展的 Spring MVC 应用程序

java - Spring和MyBatis中语句的参数group_id没有找到TypeHandler

java - 如何生成与 com.auth0 java-jwt 一起使用的 RSA key ?

java - java中的Collections.swap()交换方法中的所有内容

jquery - 我应该如何使用 javascript 访问 Spring MVC Rest 服务?

java - Maven- POM.xml 中依赖项排序的重要性

java - Spring RestTemplate,在解析为 Json 之前拦截响应

java - 字符串到日期的转换正在浪费时间

Spring工具生成Rest Client