2011-06-07 197 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) 
{ 
....... 
} 
相关问题