Как рассчитать размер файла 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 будет вашим приблизительным размером изображения, хотя он меняется после изменения размера, а затем любых операций, которые вы выполняете на нем.