2013-03-25 84 views
4

我有一個來自URL(公司內部)的PNG圖像。當我在我的網絡瀏覽器中導航到該URL時,我看到圖像正確(具有透明度)。從Chrome的網絡工具中我可以看到,它會像預期的那樣成爲一款圖像/ png MIME類型。我可以將圖像從瀏覽器保存到我的本地硬盤,最終大小約爲32kb。Web瀏覽器中的圖像與Java中的圖像之間的區別

我寫了一個簡單的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(); 
    } 
} 

,並在我的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> 

如果這種額外的層有差別,但我認爲最好提它不知道)

任何意見/建議將是多大的應用reciated。

感謝, B.J.

回答

1

當您使用ImageIO.read,你得到一個BufferedImage對象,這是Java的內部格式,而不是PNG格式。如果你把它寫到一個文件中,你就是在寫這個內部表示。我有點驚訝它的可讀性。

+0

我的歉意,我沒有包括額外的Spring代碼進行澄清。我編輯了我的問題以反映Spring圖像轉換器的使用。 – Benny 2013-03-25 15:38:45

+0

@Benny Chrome和Java應用程序是否觸發相同的轉換代碼。我的猜測是,Java應用程序沒有將所有相同的標題設置爲chrome,所以服務器返回不同的數據。 – 2013-03-25 21:20:31