2011-11-04 166 views
33

我已經使用com.sun.image.codec.jpeg.JPEGImageEncoder來處理JPEG圖像,如圖表和其他,在我的webapp。現在,我正在更新我的機器以使用JDK7,但此版本已棄用此類。下面是我需要更改代碼:如何在此代碼中替換com.sun.image.codec.jpeg.JPEGImageEncoder?

public void processChart(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 
    response.setContentType("image/jpeg"); 
    out = response.getOutputStream(); 
    response.setHeader("Pragma", "no-cache"); 
    response.setHeader("Cache-Control", "no-cache"); 
    response.setDateHeader("Expires",0); 
    try { 
     int w = Integer.parseInt(request.getParameter("WIDTH")); 
     int h = Integer.parseInt(request.getParameter("HEIGHT")); 
     java.awt.image.BufferedImage ChartImage = new java.awt.image.BufferedImage(w,h,java.awt.image.BufferedImage.TYPE_INT_RGB); 
     java.awt.Graphics2D ChartGraphics = ChartImage.createGraphics(); 
     Chart c = getChart(request); 
     c.setSize(w,h); 
     c.paint(ChartGraphics); 
     // CODE BELOW TO CHANGE... 
     com.sun.image.codec.jpeg.JPEGImageEncoder encoder = 
           com.sun.image.codec.jpeg.JPEGCodec.createJPEGEncoder(out); 
     encoder.encode(ChartImage); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

private Chart getChart(HttpServletRequest request) { 
    chartLoader loader = new chartLoader(null); 
    loader.paintDirect = true; 
    java.util.Enumeration ps = request.getParameterNames(); 
    while (ps.hasMoreElements()) { 
     String name = (String) ps.nextElement(); 
     loader.setParameter(name,request.getParameter(name)); 
    } 
    // create Chart 
    Chart chart = loader.build(false,false); 
    Chart.tmpImage = new java.awt.image.BufferedImage(200,200,java.awt.image.BufferedImage.TYPE_INT_RGB); 
    return chart; 
} 
+0

嗨,你可以請分享你使用這個圖像轉換的圖書館的版本,即時通訊面臨同樣的問題,但看看圖書館的問題,這將是很好,如果你分享maven的依賴。 – NoNaMe

回答

37

使用ImageIO,它可以讀取/寫入JPEG,PNG,GIF,BMP和開箱即用的。

ImageIO.write(ChartImage, "jpeg", out); 

通常情況下,靜態write(...)read(...)方法是不夠的,如果你需要控制壓縮或處理圖像元數據,檢查出Java Image I/O API Guide

+0

我有沒有正確使用ImageIO閱讀的JPEGS,但罰款與舊的太陽類(CMYK等..) –

+2

對於CMYK,這個其他的SO答案可能有所幫助:http://stackoverflow.com/a/2408779/180740 –

+0

是的,它確實。謝謝 –

15

從不使用com.sun。**包中的類。使用ImageIO將圖像編碼爲字節。

閱讀ImageIO tutorial

+4

ImageIO無法進入CMYK-JPEG。 JPEGImageEncoder - 可以。 – AvrDragon