在調整大小之前,如何計算調整大小的圖像的文件大小(例如JPEG)?在調整大小之前計算調整大小的圖像的文件大小(例如JPEG)
我需要發送HTTP請求內容長度,然後我將調整圖像大小,否則nginx讓我超時響應。
在調整大小之前,如何計算調整大小的圖像的文件大小(例如JPEG)?在調整大小之前計算調整大小的圖像的文件大小(例如JPEG)
我需要發送HTTP請求內容長度,然後我將調整圖像大小,否則nginx讓我超時響應。
zen0n,如果你絕對必須這樣做,使用安德魯的建議進行小修改是唯一的方法來做到這一點(做整個調整大小操作,輸出字節到ByteArrayOutputStream,所以你可以先手動計數)。
我將使用的修改是在服務器端使用像imgscalr這樣的簡單圖像調整大小的庫,傳遞代表加載圖像的BufferedImage,並取回代表新圖像大小的BufferedImage。然後通過ImageIO.write將其輸出並輸出到BufferedArrayOutputStream。
然後設置您的「Content-Length」標題並將圖像內容傳回。
由於將原始圖像字節轉換爲JPG引入了事件的壓縮和編碼順序,因此沒有準確的方法可以事先預測準確的文件長度,然後使用ImageIO.write將字節傳輸回客戶端。您必須先使用上述技術完全調整圖像大小(在內存中),然後將數據寫回客戶端。
要在客戶端執行此操作,請使用自由浮動或嵌入的小程序或框架。
使用ImageIO.write(Image,String,InputStream)
將圖像序列化到ByteArrayOutputStream
。
然後可以通過baos.toByteArray().length
找到調整大小的圖像的大小。
如果小程序或框架使用Java Web Start啓動,它將有權訪問JNLP API服務。然後,可以使用FileOpenService從沙盒應用程序中的客戶端本地文件系統獲取圖像。一個沙盒應用程序。只能將圖像上傳到它來自的服務器。
我現在認爲我誤解了這個問題的一些重要方面,但暫時我會留下答案。 – 2011-06-07 09:53:35
這是我的解決方案:
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)
{
.......
}
AFAIK你不能計算出它正是(除非這樣做),因爲JPG格式是一種有損格式,你不知道什麼會在特定的圖像丟失。 – Jaydee 2011-06-07 09:13:02
調整JPEG大小不會像降低質量(/增加壓縮)那樣改變字節大小。 – 2011-06-07 09:34:01
爲什麼你需要計算大小?我想你想在上傳之前調整文件大小,如果是這種情況,我認爲有更好的替代方法可以做。 – 2011-06-07 10:08:23