如何在调整大小之前计算已调整大小的图像(例如JPEG)的文件大小?
我需要发送HTTP请求内容长度,然后我会调整图像大小,否则nginx会让我超时响应。
答案 0 :(得分:0)
要在客户端执行此操作,请使用自由浮动或嵌入式小程序或框架。
使用ImageIO.write(Image,String,InputStream)
将图片序列化为ByteArrayOutputStream
。
然后可以通过baos.toByteArray().length
找到已调整大小的图像的大小。
如果使用Java Web Start启动小程序或框架,它将可以访问JNLP API服务。然后,FileOpenService可用于从沙盒应用程序中获取客户端本地文件系统中的图像。一个沙盒应用程序。只能将图像上传到它来自的服务器。
答案 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)
{
.......
}