4

URL (会社の内部) からの PNG 画像があります。Web ブラウザーでその URL に移動すると、画像が正しく表示されます (透過性あり)。Chrome のネットワーク ツールから、期待どおり image/png MIME タイプとして返​​されていることがわかります。ブラウザからローカル ハード ドライブに画像を保存すると、最終的に約 32 KB のサイズになります。

画像をプルダウンしてプログラムで保存する簡単な 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 は、実際には ImageIO.read を使用して実際の画像 URL から BufferedImage を返す Java Web アプリケーションを指しています。

@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

4

1 に答える 1

1

ImageIO.read を使用すると、PNG 形式ではなく、Java の内部形式である BufferedImage オブジェクトを取得します。それをファイルに書き出す場合は、その内部表現を書き込んでいます。全然読めるからちょっとびっくり。

于 2013-03-25T15:32:36.967 に答える