在调整大小之前,如何计算调整大小的图像的文件大小(例如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