2011-06-07 446 views
1

在調整大小之前,如何計算調整大小的圖像的文件大小(例如JPEG)?在調整大小之前計算調整大小的圖像的文件大小(例如JPEG)

我需要發送HTTP請求內容長度,然後我將調整圖像大小,否則nginx讓我超時響應。

+2

AFAIK你不能計算出它正是(除非這樣做),因爲JPG格式是一種有損格式,你不知道什麼會在特定的圖像丟失。 – Jaydee 2011-06-07 09:13:02

+0

調整JPEG大小不會像降低質量(/增加壓縮)那樣改變字節大小。 – 2011-06-07 09:34:01

+0

爲什麼你需要計算大小?我想你想在上傳之前調整文件大小,如果是這種情況,我認爲有更好的替代方法可以做。 – 2011-06-07 10:08:23

回答

0

zen0n,如果你絕對必須這樣做,使用安德魯的建議進行小修改是唯一的方法來做到這一點(做整個調整大小操作,輸出字節到ByteArrayOutputStream,所以你可以先手動計數)。

我將使用的修改是在服務器端使用像imgscalr這樣的簡單圖像調整大小的庫,傳遞代表加載圖像的BufferedImage,並取回代表新圖像大小的BufferedImage。然後通過ImageIO.write將其輸出並輸出到BufferedArrayOutputStream。

然後設置您的「Content-Length」標題並將圖像內容傳回。

由於將原始圖像字節轉換爲JPG引入了事件的壓縮和編碼順序,因此沒有準確的方法可以事先預測準確的文件長度,然後使用ImageIO.write將字節傳輸回客戶端。您必須先使用上述技術完全調整圖像大小(在內存中),然後將數據寫回客戶端。

0

要在客戶端執行此操作,請使用自由浮動或嵌入的小程序或框架。

使用ImageIO.write(Image,String,InputStream)將圖像序列化到ByteArrayOutputStream

然後可以通過baos.toByteArray().length找到調整大小的圖像的大小。

如果小程序或框架使用Java Web Start啓動,它將有權訪問JNLP API服務。然後,可以使用FileOpenService從沙盒應用程序中的客戶端本地文件系統獲取圖像。一個沙盒應用程序。只能將圖像上傳到它來自的服務器。

這是我的demo. of the JNLP file services

+0

我現在認爲我誤解了這個問題的一些重要方面,但暫時我會留下答案。 – 2011-06-07 09:53:35

0

這是我的解決方案:

public class IOSUtil { 

private static int FILEBUFFERSIZE = 1024; 

public static int input2OutputStream(InputStream is, OutputStream os) 
     throws IOException { 
     byte[] bytes = new byte[FILEBUFFERSIZE]; 
     int bytesRead; 
     int allBytes = 0; 
     while ((bytesRead = is.read(bytes)) != -1) { 
      os.write(bytes, 0, bytesRead); 
      allBytes+=bytesRead; 
     } 

     is.close(); 
     os.close(); 
     return allBytes; 
    } 

public IOSUtil() { 
     super(); 
    } 

} 
................ 
protected InputStream setLength(InputStream is) throws IOException 
{ 
    PipedInputStream in = new PipedInputStream(); 
    PipedOutputStream pout = new PipedOutputStream(in); 
    length = IOSUtil.input2OutputStream(is, pout); 
    return in; 
} 

@Override 
protected InputStream getInputStreamContent(CMObject cmObject) throws CMException { 

    try { 
     Integer cacheLength = new Integer(0); 
     if((cacheLength = (Integer) getCacheService().getCache(getCacheService().createKeyForImageResize(cmObject.getCode(), ImageProcessor.getWidth(width, height), height))) == null) 
     { 
     return setLength(resizeImage(cmObject)); 
     } else 
     { 
      length = cacheLength; 
      return resizeImage(cmObject); 
     } 
    } catch (IOException e) { 
     length = super.getLength(cmObject); 
     log.error("Error resize image", e); 
    } 

    return super.getInputStreamContent(cmObject); 
} 
private InputStream resizeImage(CMObject cmObject) 
{ 
....... 
} 
相關問題