Как рассчитать размер файла java BufferedImage
У меня есть приложение на основе сервлета, которое обслуживает изображения из файлов, хранящихся локально. Я добавил логику, которая позволит приложению загружать файл изображения в BufferedImage, а затем изменять размер изображения, добавлять текст водяного знака над верхней частью изображения или и то, и другое.
Я хочу задать длину содержимого перед записью изображения. Помимо записи изображения во временный файл или массив байтов, есть ли способ найти размер BufferedImage?
Все файлы записываются как jpg, если это помогает в вычислении размера.
Ответы
Ответ 1
Нет, вы должны записать файл в память или во временный файл.
Причина в том, что невозможно предсказать, как кодировка JPEG повлияет на размер файла.
Кроме того, он недостаточно хорош, чтобы "угадать" размер файла; заголовок Content-Length
должен быть включен.
Ответ 2
BufferedImage img = = new BufferedImage(500, 300, BufferedImage.TYPE_INT_RGB);
ByteArrayOutputStream tmp = new ByteArrayOutputStream();
ImageIO.write(img, "png", tmp);
tmp.close();
Integer contentLength = tmp.size();
response.setContentType("image/png");
response.setHeader("Content-Length",contentLength.toString());
OutputStream out = response.getOutputStream();
out.write(tmp.toByteArray());
out.close();
Ответ 3
Ну, BufferedImage не знает, что он написан как JPEG - насколько это возможно, это может быть PNG или GIF или TGA или TIFF или BMP... и все они имеют разные размеры файлов. Поэтому я не верю, что BufferedImage может дать вам размер файла напрямую. Вам просто нужно записать его и подсчитать байты.
Ответ 4
Если это очень маленький файл изображения, предпочитайте использовать закодированную кодировку с указанием длины содержимого.
В одном или двух последних подкастах stackoverflow было отмечено, что HTTP-прокси часто сообщают, что они поддерживают HTTP/1.0, что может быть проблемой.
Ответ 5
Вы можете легко вычислить размер BufferedImage в памяти. Это потому, что это оболочка для WritableRaster, которая использует DataBuffer для ее поддержки. Если вы хотите вычислить его размер в памяти, вы можете получить копию растра изображения с помощью getData(), а затем измерить размер буфера данных в растере.
DataBuffer dataBuffer = bufImg.getData().getDataBuffer();
// Each bank element in the data buffer is a 32-bit integer
long sizeBytes = ((long) dataBuffer.getSize()) * 4l;
long sizeMB = sizeBytes / (1024l * 1024l);`
Ответ 6
Перед загрузкой файла изображения в качестве BufferedImage сделайте ссылку на файл изображения через объект File.
File imgObj = new File("your Image file path");
int imgLength = (int) imgObj.length();
imgLength будет вашим приблизительным размером изображения, хотя он меняется после изменения размера, а затем любых операций, которые вы выполняете на нем.