在调整大小之前计算已调整大小的图像的文件大小(例如JPEG)

时间:2011-06-07 09:03:29

标签: java image image-processing resize nginx

如何在调整大小之前计算已调整大小的图像(例如JPEG)的文件大小?

我需要发送HTTP请求内容长度,然后我会调整图像大小,否则nginx会让我超时响应。

3 个答案:

答案 0 :(得分:0)

要在客户端执行此操作,请使用自由浮动或嵌入式小程序或框架。

使用ImageIO.write(Image,String,InputStream)将图片序列化为ByteArrayOutputStream

然后可以通过baos.toByteArray().length找到已调整大小的图像的大小。

如果使用Java Web Start启动小程序或框架,它将可以访问JNLP API服务。然后,FileOpenService可用于从沙盒应用程序中获取客户端本地文件系统中的图像。一个沙盒应用程序。只能将图像上传到它来自的服务器。

这是我的demo. of the JNLP file services

答案 1 :(得分:0)

zen0n,如果你必须这样做,使用Andrew的建议进行微小修改是唯一的方法(执行整个调整大小操作,将字节输出到ByteArrayOutputStream,这样你就可以事先计算它们。)< / p>

我将使用的修改是在服务器端使用简单的图像大小调整库(如imgscalr),传入代表加载图像的BufferedImage,并获取一个表示新大小的调整大小的BufferedImage图片。然后将其泵入ImageIO.write并将其输出到BufferedArrayOutputStream。

然后设置“Content-Length”标题并重新传输图像内容。

因为将原始图像字节转换为JPG会引入事件的压缩和编码序列,所以没有准确的方法可以预先预先确定准确的文件长度,然后使用ImageIO.write将字节流回客户端。您必须首先使用上述技术完全调整图像大小(在内存中),然后将数据写回客户端。

答案 2 :(得分: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)
{
.......
}