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

Java 在调整大小之前计算已调整大小的图像(例如JPEG)的文件大小,java,image,image-processing,resize,nginx,Java,Image,Image Processing,Resize,Nginx,在调整大小之前,如何计算已调整大小的图像(例如JPEG)的文件大小 我需要发送HTTP请求内容长度,然后我将调整图像大小,否则nginx get me超时响应。要在客户端执行此操作,请使用自由浮动或嵌入式小程序或框架 使用ImageIO.write(图像、字符串、输入流)将图像序列化为ByteArrayOutputStream 然后可以通过,baos.toByteArray().length找到调整大小的图像的大小 如果使用启动小程序或框架,则它将可以访问JNLPAPI服务。然后,可以使用Fil

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


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

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

使用
ImageIO.write(图像、字符串、输入流)
将图像序列化为
ByteArrayOutputStream

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

如果使用启动小程序或框架,则它将可以访问JNLPAPI服务。然后,可以使用FileOpenService在沙盒应用程序中从客户端的本地文件系统获取图像。沙盒应用程序。只能将图像上载到它来自的服务器


这是我的。

zen0n,如果你一定要这样做,使用Andrew的建议并稍加修改是唯一的方法(执行整个调整大小操作,将字节输出到ByteArrayOutputStream,以便你可以在开始之前进行计数)

我将使用的修改是使用一个简单的图像大小调整库在服务器端执行此操作,例如,传入表示加载图像的BuffereImage,然后返回一个表示新大小图像的已调整大小的BuffereImage。然后通过ImageIO.write将其压缩并输出到BufferedArrayOutputStream

然后设置“Content Length”标题并将图像内容流回

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

这是我的解决方案:

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)
{
.......
}

当然,你不能精确地计算它(除非这样做),因为jpg是一种有损格式,你不知道在特定的图像中会丢失什么。调整JPEG的大小不会像降低质量(增加压缩)那样改变字节大小。为什么要计算大小?我猜你想在上传之前调整文件大小,如果是这样的话,我认为有更好的替代方法。我有nginx限制请求时间:3秒。我的servlet是为不同的手机生成移动内容。每秒60个请求。有时我的servlet工作时间超过3秒。我现在认为我误解了问题的一些重要方面,但我暂时不回答。